我在这里读了几个关于结构的线程,并且有一个关于结构以及它们应该如何表示不可变值(例如像数字-1),因为它们的值类型行为/语义。
但另一方面,结构代表电话号码之类的东西,可以改变同一个家庭。
这是一条坚硬而快速的规则吗?
答案 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正在使用中。