如何检测C#函数中的变异?

Mat*_*tin 3 c# functional-programming

我一直在阅读有关如何在C#中编写函数(即F#)样式的文章,例如,上述循环用于递归并始终返回值/对象的副本,而不是使用新状态返回相同的变量.

例如,我应该注意哪种代码检查?有没有办法判断一个BCL类的方法是否会导致变异?

Pat*_*eam 5

NDepend工具可以告诉你哪里有副作用.它还可以自动确保类是不可变的(即对其对象实例没有副作用)或方法是纯的(即在执行方法期间没有副作用.免责声明:我是该工具的开发人员之一.

简而言之,技巧是定义一个属性,例如MyNamespace.ImmutableAttribute,以及标记您希望不可变的类.

[Immutable]class MyImmutableClass {...}
Run Code Online (Sandbox Code Playgroud)

如果类不是不可变的,或者更有可能,如果有一天开发人员修改它并破坏其不变性,那么以下代码规则LINQ查询(CQLinq)将突然发出警告:

warnif count > 0 
from t in Application.Types
where !t.IsImmutable && t.HasAttribute("MyNamespace.ImmutableAttribute")
select t
Run Code Online (Sandbox Code Playgroud)

在旁注中,我写了一篇关于不变性/纯度/副作用和NDepend用法的文章:不可改变的 类型:理解它们并使用它们