除了对代码合同“没有明显的副作用”之外,[Pure]是否有任何其他影响?

时间:2015-01-02 20:46:30

标签: c# custom-attributes code-contracts purely-functional

PureAttribute documentation说:

  

表示类型或方法是纯的,也就是说,它不会进行任何可见的状态更改

  1. 这是Microsoft Code Contracts中Pure函数的唯一要求吗?

  2. 和;该模型是否假设异常是结果(而不是副作用)?

  3. 我问,因为在更一般的上下文中,a pure function 意味着输出仅取决于输入;即。它不能是I / O或随机函数的结果。

    有人可能会争辩说,纯函数总是会为外表达式产生一个值,可能与异常相反。

    如果[Pure]确实限于较少限制的形式,是否有相当于“[FunctionalPure]”?

1 个答案:

答案 0 :(得分:2)

静态分析器假设连续两次使用相同的参数调用相同的纯函数会产生相同的结果。

鉴于

[Pure]
public delegate int F(int i);

public class A
{
  public void f(F f)
  {
    var i = f(1);
    Contract.Assert(i == f(1));
  }
}

生成警告:“建议的假设:可以证明假设:考虑将其更改为断言。”

因此,例如DateTime.Now不得使用Pure属性进行注释。

至于例外情况,似乎没有任何禁止它们的东西,也没有要求它们被一致地抛出。一般来说,不可能。几乎任何代码都可以获得OutOfMemoryException,甚至是具有先前成功的相同参数的纯函数。