在C#中,值类型是可变的还是不可变的?

Kun*_*esh 15 c# value-type reference-type

值类型行为表明,我们持有的任何值都无法通过其他变量进行更改.

但是我仍然对我在这篇文章标题中提到的内容感到困惑.任何人都可以澄清吗?

dle*_*lev 23

值类型可以是可变的(模数一些奇怪的边缘情况)不可变,具体取决于您如何编写它们.

易变的:

public struct MutableValueType
{
    public int MyInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一成不变的:

public struct ImmutableValueType
{
    private readonly int myInt;
    public ImmutableValueType(int i) { this.myInt = i; }

    public int MyInt { get { return this.myInt; } }
}
Run Code Online (Sandbox Code Playgroud)

内置值类型(int,double等)不可变的,但是你可以很轻松地创建自己的可变struct秒.

一条建议:不要.可变值类型是一个坏主意,应该避免.例如,这段代码做了什么:

SomeType t = new SomeType();
t.X = 5;

SomeType u = t;
t.X = 10;

Console.WriteLine(u.X);
Run Code Online (Sandbox Code Playgroud)

这取决于.如果SomeType是值类型,则打印5,这是一个非常令人困惑的结果.

有关为什么要避免使用可变值类型的详细信息,请参阅此问题.

  • 在您的示例中,如果SomeType是具有整数字段X的值类型,则uX将为5.该信息和上面的代码足以显​​示该信息; 它应该很难"出乎意料".现在假设t是类类型,并且在创建t和WriteLine调用之间的*anyplace* - 甚至在"tx = 10"之前,调用了SomeInheritableClassObject.SomeVirtualFunction(t).在不检查SomeVirtualFunction*的所有可能覆盖的情况下,无法知道WriteLine将输出什么.我认为可变结构的可预测行为更为可取. (2认同)