gpt4 book ai didi

c# - 值类型的可变性

转载 作者:太空狗 更新时间:2023-10-29 22:08:41 24 4
gpt4 key购买 nike

考虑 TranslateAllCoords 静态函数:

static class CoordinateTransformation
{
public static void TranslateAllCoords(ref int x, ref int y, ref int z,
int amount)
{
x+=amount;
y+=amount;
z+=amount;
}
}

然后,稍后在代码中,您有:

int x=0, y=0, z=0;
...
CoordinateTransformation.TranslateAllCoords(ref x, ref y, ref z, 5);
...

但是,通过调用 TranslateAllCoords,您实际上是在修改值类型(即整数坐标),并且通常值类型应该是不可变的。这里是否违反了一些规则,或者这是一个完全有效的构造,它通过仅修改内置值类型来绕过“值类型应该是不可变的”构造?

最佳答案

是不可变的。包含值类型的变量是可变的。变量各不相同,这就是它们被称为“变量”的原因。

值类型应该是不可变的设计指南本质上是说您不应该尝试只更改变量的一部分。当你说

struct Point { public int X; public int Y; public int Z; }
...
Point p = new Point();
p.X = 123;

那么你所说的是“只改变变量 p 的一部分”。这令人困惑。变量p在逻辑上应该代表一个点,一个点就是一个值。如果你想改变 p,那么通过给它分配一个新的点从逻辑上改变整个事物。不要将一个点突变为另一个点。

但即使我们让点不可变:

struct Point { public int X { get; private set; } ... etc }

那么该类型的变量仍然可以变化!

Point p = new Point(123, 456, 789);
p = new Point(100, 200, 300);

但现在很明显,整个变量正在改变到一个新的点,而不是我们试图改变变量的特定部分。

使用不可变值类型,您可以更明智地进行转换:

static Point Translate(Point p, int offset) 
{
return new Point(p.X + offset, p.Y + offset, p.Z + offset);
}
...
Point p = new Point(100, 200, 300);
p = Translate(p, 5);

再一次看到,p 发生了变异,但它是一次性全部变异的,而不是一次一点一点地变异。

关于c# - 值类型的可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166691/

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