2015-01-02 13 views
1

PureAttribute documentation说:除了对代码合同没有“可见的副作用”之外,[Pure]是否有其他含义?

表示一个类型或方法是纯粹的,也就是说,它不会使任何可见的状态改变

  1. 难道这就是的唯一要求微软代码合同中的纯函数?

  2. 而且;这个模型是否假定异常是结果(而不是副作用)?

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

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

如果[Pure]的确限于限制性较弱的形式,是否有等价的“[FunctionalPure]”?

+1

相关讨论:http://stackoverflow.com/questions/12335245/why-is-catching-an-exception-non-pure-but-throwing-an-exception-is-pure –

+0

@ 500-InternalServerError谢谢 - 这是一个非常好的阅读。我没有从确定性(或缺乏)的角度来考虑它。 – user2864740

回答

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,即使是具有以前成功的相同参数的纯函数。

相关问题