Value Types, Immutability (Good) & Mutability (Evil) in .NET
我最近阅读了很多关于价值类型和参考类型及其差异的文献。这个问题围绕着值类型的可变性和不可变性的主题。
根据我读到的内容,似乎.NET中的值类型应该以不可变的方式写入;也就是说,一旦为它们分配了一个值,该类型在内存中的值就不会改变。只有类型的后续副本才能使用基于原始值的新值在内存中构造新实例。在.NET中,易变性似乎是邪恶的。
为了澄清对不变性的理解(为了我自己的理智和他人的理智),我在下面演示了这一点:
1 2 3 | DateTime dt = new DateTime(); DateTime newdt = dt.AddDays(2); // Okay, new value stored in newdt newdt.Year = 1945; // Error, cannot write to readonly property |
但是,当查看ar基元类型(如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int x = 0; // xor eax, eax; 'clear register to 0 // push eax; 'push eax (0) onto the stack x = 5; // pop eax; 'pop stack (0) into eax // mov eax, 5; 'eax = 5 // push eax; 'push eax (5) onto the stack x++; // pop eax; 'pop stack (5) into eax // add eax, 1; 'eax = 5 + 1 // push eax; 'push eax (6) onto the stack |
到目前为止一切都很好;微软似乎在实现其价值类型的不变性方面做得很好;但随后我们开始发现不好的苹果,并细分使易变性看起来正常的细微差别,诱使开发人员产生一种错误的安全感!
我说的是系统中的点、大小、矩形(以及其他一些)。
突然间,我们被赋予了根据一个值的属性改变它的类型的能力,我有了一个理论来解释为什么这是可能的;例如下面的代码
1 2 3 4 5 6 7 8 |
然而,如前所述,我有一个理论解释为什么这些结构是可变的:
最后我的问题是:
可变性问题不是值与引用类型的问题。两者都有例子。以
可变与不可变是基于类型用法的设计决策。它是引用类型还是值类型是另一个不依赖于前者的设计决策。
六羟甲基三聚氰胺六甲醚。。。这可能很快就要结束了,但我的观点是。
通常使用结构来保存一些属性或基元类型。有一些关于您应该和不应该在结构中拥有什么的文章,以便它们在堆或堆栈上结束,但这超出了这里的范围。如果您有一个令人信服的理由使用可变结构,并将其记录下来,以便下一个开发人员知道原因,那就没问题了。如果相反,你不在乎,文档也不在你的列表中,那么,什么是可接受的或者不可接受的并不重要。