在整个 Stack Overflow 和互联网上,我看到保持结构体不可变是一种好的设计原则。不幸的是,我从未见过任何实现可以使这些结构体真正不可变。
假设一个结构体内部没有任何引用类型,我该如何实际使一个结构体不可变呢?也就是说,我该如何防止其所有基本字段的变异(也许通过编译时或运行时异常)?
我写了一个简单的测试试图使结构体不可变,但甚至使用 System.ComponentModel.ImmutableObjectAttribute
也不起作用:
```C# // 程序代码 ```
class Program
{
static void Main(string[] args)
{
ImmutableStruct immStruct1 = new ImmutableStruct();
Console.WriteLine(immStruct1); //Before mutation.
immStruct1.field1 = 1;
immStruct1.field2 = "Hello";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 1st mutation.
immStruct1.field1 = 2;
immStruct1.field2 = "World";
immStruct1.field3 = new object();
Console.WriteLine(immStruct1); //After 2nd mutation.
Console.ReadKey();
}
}
[ImmutableObject(true)]
struct ImmutableStruct
{
public int field1;
public string field2;
public object field3;
public override string ToString()
{
string field3String = "null";
if (field3 != null)
{
field3String = field3.GetHashCode().ToString();
}
return String.Format("Field1: {0}, Field2: {1}, Field3: {2}", field1, field2, field3String);
}
}