遍及Stack Overflow和Internet我发现保持结构不变是一个很好的设计原则。不幸的是,我从来没有看到任何实际上导致这些结构真正不可变的实现。如何使一个结构不可变?
假设一个结构里面没有任何引用类型,我怎么才能让一个结构不可变?也就是说,我如何防止其任何原始字段(可能是编译时/运行时异常)的突变?
我写了一个简单的测试试图做一个结构不变,但即使不使用System.ComponentModel.ImmutableObjectAttribute
工作:
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);
}
}
有点OT,但有一些具体的原因,你需要一个结构,而不是只使用一个类?我还没有找到一个使用情况,其中一个结构比多年LOB编程中的类更可取。 – StingyJack
将字段标记为只读?另外,你有没有看到这个:http://stackoverflow.com/questions/29974301/should-a-c-sharp-struct-have-only-read-only-properties – Pawel
该结构头脑类似于C++的位域结构。该结构被实例化,我的愿望是结构将永远不会改变 - 有一个承诺,我没有意外修改数据。 –