结构总是不可变的吗?

时间:2010-02-21 01:54:16

标签: c#

我在这里读了几个关于结构的线程,并且有一个关于结构以及它们应该如何表示不可变值(例如像数字-1),因为它们的值类型行为/语义。

但另一方面,结构代表电话号码之类的东西,可以改变同一个家庭。

这是一条坚硬而快速的规则吗?

4 个答案:

答案 0 :(得分:5)

电话号码不会改变;你只是得到一个不同的并丢弃旧的。旧的仍然是一如既往的。与日期,数字等相同 - 在接近结构时考虑这一点。它们是一种封装值的方法 - 只需 ;而不是值的使用,这会改变。

答案 1 :(得分:3)

是的,结构应始终是不可变的!可变结构会导致可怕的头痛,因为它们的使用会产生非常奇怪的行为。

答案 2 :(得分:1)

是的,结构应该几乎总是不可变的。例如,在您的电话号码的情况下,电话号码本身不会改变:会发生的情况是家庭被分配了一个新的电话号码。电话号码555-555-1234仍然是电话号码555-555-1234,但家庭的电话号码是不同号码555-555-5678。

请注意,您可以在.NET Framework中找到违反此准则的行为。例如,WPF Point和Size结构是可变的。这不是一个好习惯,因为当人们试图写something.Location.X = newX时会发现。

答案 3 :(得分:0)

不可变值!=不可变的变量

我的意思是,即使您的变量包含无法更改的,您仍然可以将变量更改为具有不同的内容。 int x = 5; x++;是合法的。 5++;不是。

如果你的结构包含一个整数,并为该整数分配一个新值(例如myStruct.MyInt++。你可能认为你正在改变MyInt的值。真的,你要存储一个新值比旧值大一个。

为什么重要?因为可能有另一个线程同时访问myStruct.MyInt,并且您不希望它正在使用的值突然改变int正在使用中。