gpt4 book ai didi

c# - 为什么这种方法不纯?

转载 作者:太空狗 更新时间:2023-10-29 20:48:31 25 4
gpt4 key购买 nike

我读了这个答案:https://stackoverflow.com/a/9928643/16241

但是我显然不明白,因为我想不通为什么我的方法是不纯的。 (有问题的方法是 ToExactLocation())。

public struct ScreenLocation
{
public ScreenLocation(int x, int y):this()
{
X = x;
Y = y;
}

public int X { get; set; }
public int Y { get; set; }

public ExactLocation ToExactLocation()
{
return new ExactLocation {X = this.X, Y = this.Y};
}

// Other stuff
}

如果你需要它,这里是确切的位置结构:

public struct ExactLocation
{
public double X { get; set; }
public double Y { get; set; }

// Various Operator Overloads, but no constructor
}

我是这样调用它的:

someScreenLocation = MethodThatGivesAScreenLocation();
if (DestinationLocation == someScreenLocation.ToExactLocation())
{
// Do stuff
}

当我这样做时,ReSharper 用 “Impure Method is called for readonly field of value type.”标记它。

为什么这么说?我该怎么做才能让它消失?

最佳答案

它不是纯粹的,因为它不返回仅依赖于其输入的值。当 XY 的值发生变化时,ToExactLocation 的返回值也会发生变化,即其输出取决于内部可变状态。

此外,ExactLocationXY 的 setter 可能 会改变输入。 ScreenLocation 的 getter 也可以。

someScreenLocation 是一个只读字段,是一个值类型。您正在对一个值(即只读字段)调用 ToExactLocation。当您访问一个合理的值类型时,会创建一个副本以避免改变值本身。但是,您的调用可能会改变该值,在许多情况下,这不是您想要的,因为您将改变副本。这就是您收到警告的原因。

在这种情况下,您可以忽略它,但我通常会避免使用可变值类型。

编辑:

让我尝试简化...

struct Point
{
int X;
int Y;
bool Mutate() { X++; Y++; }
}

class Foo
{
public readonly Point P;
Foo()
{
P = new Point();
P.Mutate(); // impure function on readonly value type
}
}

Mutate() 被调用时,P 的副本被创建并与该方法一起传递。 P 的内部状态的任何变化都是无关紧要的,因为它会改变一个副本。

关于c# - 为什么这种方法不纯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15607253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com