gpt4 book ai didi

c# - C# 中的结构未按预期工作

转载 作者:行者123 更新时间:2023-11-30 20:18:13 24 4
gpt4 key购买 nike

我正在开发一个简单的应用程序,但我有点困惑。我有一个带有 int xint y 的简单 struct Point。我将它用于 Line

public class Line : Shape {

public Line() {
PointA = new Point(x: 0, y: 0);
PointB = new Point(x: 0, y: 0);
}

public Point PointA { get; set; }
public Point PointB { get; set; }
}

在某处

var line = new Line();
line.PointB = new Point(x: 4, y: 2);
Console.WriteLine($"Line start at {line.PointA.GetX()}:{line.PointA.GetY()}; end at {line.PointB.GetX()}:{line.PointB.GetY()}");

for (int i = 0; i < 10; i++) {
line.PointB.IncrementX();
line.PointB.IncrementY();
}
Console.WriteLine($"Line start at {line.PointA.GetX()}:{line.PointA.GetY()}; end at {line.PointB.GetX()}:{line.PointB.GetY()}");

这里需要增加 Pointxy 但结果没有改变:

Line start at 0:0; end at 4:2
Line start at 0:0; end at 4:2

我做错了什么?这似乎很奇怪。在 C# 中使用 struct 有一些特定的规则吗?我知道这是一个值类型,但我认为它对 Point 有好处。所有示例都使用 struct 作为 Point。请帮忙?

要点:

public struct Point {

private int _x;
private int _y;

public Point(int x, int y)
: this() {
_x = x;
_y = y;
}

public void IncrementX() {
_x++;
}
public void IncrementY() {
_y++;
}

public int GetX() {
return _x;
}
public int GetY() {
return _y;
}
}

最佳答案

结构是一种值类型。它是按值传递的(即通过创建所有字段的副本)而不是传递对结构实例的引用。所以当你这样做的时候

line.PointB.IncrementX()

当您调用 PropertyB 的 getter 时,它会返回存储在 PropertyB 支持字段中的 Point 的副本。然后你在 copy 上调用 increment。因此原始值将保持不变。

进一步阅读:Value and Reference Types特别是Mutating Readonly Structs这说

mutable value types are evil. Try to always make value types immutable.


如果你想实际移动线点,你可以做什么?

  • 将点类型更改为。然后它将通过引用传递,所有方法将在您存储在 Line 中的原始点上调用。

  • 将新的(修改后的)点实例分配给线

即你应该存储副本,更改它并分配回去

var point = line.PointB; // get copy
point.IncrementX(); // mutate copy
point.IncrementY();
line.PointB = point; // assign copy of copy

您还可以使您的 Point 结构不可变(您可以为值类型做的最好的事情):

public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}

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

public Point IncrementX() => new Point(X + 1, Y);
public Point IncrementY() => new Point(X, Y + 1);
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
}

现在改变位置看起来像

line.PointB = line.PointB.Move(1, 1);

关于c# - C# 中的结构未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41904726/

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