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

时间:2015-08-18 03:56:45

标签: c# c#-4.0 xna

这是一个矩形的简单扩展方法,例如pure?

如果没有,为什么不呢? 如果是,为什么?

    [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 个答案:

答案 0 :(得分:6)

根据Wikipedia - Pure function

  

在计算机编程中,如果以下关于函数的语句都保持不变,则函数可以被认为是纯函数:

     
      
  1. 在给定相同参数值的情况下,函数始终评估相同的结果值。函数结果值不能依赖于程序执行过程中或程序执行不同时可能发生的任何隐藏信息或状态,也不依赖于I / O设备的任何外部输入(通常见下文)。
  2.   
  3. 对结果的评估不会导致任何语义上可观察到的副作用或输出,例如可变对象的突变或输出到I / O设备(通常见下文)。
  4.   

Microsoft documentation for the PureAttribute说明了这一点:

  

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

微软对纯方法的描述有些简短,缺少一个关键部分,在给定相同输入参数的情况下,纯方法应始终评估相同的结果。

你的方法是纯粹的吗?

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