C# 关于[纯]方法的问题

C# 关于[纯]方法的问题,c#,code-contracts,C#,Code Contracts,以下方法是纯的吗?我可以这么说,因为它在当前类中不会发生任何变化,因此,在运行此方法之前,我们现在可以在类中“看到”的所有内容在运行之后仍然完全相同。我说得对吗 class Set { ... public ISet<T> UnionWith(ISet<T> set) { ISet<T> unionSet = ... foreach (Element element in this) {

以下方法是纯的吗?我可以这么说,因为它在当前类中不会发生任何变化,因此,在运行此方法之前,我们现在可以在类中“看到”的所有内容在运行之后仍然完全相同。我说得对吗

class Set {
    ...
    public ISet<T> UnionWith(ISet<T> set) {
       ISet<T> unionSet = ...

        foreach (Element element in this) {
            unionSet.Add(element);
        }

        foreach (Element element in set) {
           unionSet.Add(element);
        }

        return unionSet;
    }
}
类集合{
...
公共ISet UnionWith(ISet集合){
ISet unionSet=。。。
foreach(此中的元素){
unionSet.Add(元素);
}
foreach(集合中的元素){
unionSet.Add(元素);
}
返回联合集;
}
}

如果您所说的
[Pure]
是指标记了来自的属性,文档中会说:

纯方法不会使任何对象可见 状态改变


因为您的方法似乎没有任何可见的状态改变(即没有副作用),它将符合<代码> [纯] < /> >属性。

也许您正在寻找“幂等项”。注意到(概念上)在考虑函数是否纯时考虑您的抽象级别是很重要的。它确实是纯对象方面的,因为它不会改变任何当前对象(新对象除外)的状态,但它不是纯系统方面的-它分配内存,因此它会改变系统的状态。我可以看到此功能的要点,但看不到其值:“当前分析工具不强制执行此属性;只有在确定方法是纯的情况下,才应该使用此属性。“-MSDNIs是否有他的方法不符合的“纯”定义?据我所知,它在数学上也是纯的-如果输入相同,它将始终生成相同的输出(
作为输入计数)帕维尔:一些“纯”的定义要求输入是不可变的。考虑一个包装函数,如果一个输入函数是纯的,那么它就记住了一个输入函数。如果集合可以在没有包装器知道的情况下改变,那么你可以说Unnon并不是“足够纯净”。“用一个包装器来记忆。就在我回答这个问题的那一刻,有人回答说它不是,使用了与C#的代码契约不同的纯定义。但它的作者后来删除了它。其思想是,如果在不同的时间将相同的ISet传递给我的类,因为我的类的元素在不同的时间可能不同,那么您将获得不同的输出,因此您的函数不是纯函数@吞食:那是我,帕维尔可能能看到我删除的答案;我想这取决于你如何看待它;如果你把
这个
看作一个参数,那么它是纯的,如果你从字面上理解函数签名(只有一个参数),那么它就不是纯的。Gabe的回答在技术上是正确的,因为
PureAttribute
不同于“纯函数”。我想补充一点,就目前的问题而言,我们无法判断类本身是否是可变的。如果不是,并且集合的元素在构造后不能更改,那么UnionWith将是一个纯函数。(但不管类的易变性如何,这个答案在技术上仍然是正确的。)