在C#中,定义纯方法的规则是什么?

7
这个矩形的简单扩展方法是否是纯的呢?如果不是,为什么呢?如果是,为什么呢?
    [Pure]
    public static Rectangle InflateCopy(this Rectangle r, float horizontal, float vertical)
    {
        r.X -= (int)horizontalAmount;
        r.Y -= (int)verticalAmount;
        r.Width += (int)horizontalAmount*2;
        r.Height += (int)verticalAmount*2;
        return r;
    }
1个回答

11
根据维基百科 - 纯函数
在计算机编程中,如果函数符合以下两个条件,则可以认为该函数是纯函数:
1. 对于相同的参数值,函数始终计算出相同的结果值。函数结果值不能依赖于任何可能在程序执行期间或程序的不同执行之间发生变化的隐藏信息或状态,也不能依赖于来自I/O设备的任何外部输入(通常情况下除外-见下文)。 2. 结果的评估不会引起任何语义上可观察的副作用或输出,例如可变对象的突变或I/O设备的输出(通常情况下除外-见下文)。 Microsoft对PureAttribute的文档表明:
指示类型或方法是纯的,即它不会造成任何可见的状态更改。
Microsoft对纯方法的描述有些简短,并且缺少一个关键点,即纯方法应始终根据相同的输入参数计算出相同的结果。

那么你的方法是纯的吗?

  1. 如果您提供相同的矩形和相同的其他参数值,它将始终生成相同的输出,它不使用任何其他变量或信息,只使用通过参数提供给它的内容。
  2. 假设您使用的是System.Drawing.Rectangle中的Rectangle,它是一个struct,那么即使该方法似乎正在更改矩形,它实际上只是更改其自己的私有副本,因此您不会看到任何观察到的副作用。
  3. 它不使用或更改状态(状态被认为是除参数值外的所有外部内容)。

所以,是的,这个方法是纯的。


2
假设您使用的Rectangle是System.Drawing.Rectangle。OP正在使用XNA,因此应该使用Microsoft.Xna.Framework.Rectangle。不管怎样,它都是一个结构体 ;) - user585968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接