我一直在阅读关于结构的广泛阅读,我对你在哪里使用它们有一个很好的理解。有一件事让我感到困扰的是,不管我读了多少,我都不明白结构的不变性。
我理解,就像字符串一样,如果你改变它们,你基本上在内存中创建一个全新的对象,但这也适用于结构中的值。例如:
public struct SomeValues
{
public int AnInt;
public float AFloat;
public string AString;
}
public SomeValues[] ArrayOfValues;
private void SomeFunctionThatRunsContinuously()
{
/*so for every value I change, do I essentially create a whole new instance
of SomeValues?*/
for (int i = 0; i < ArrayOfValues.Length; i++)
{
//Is this another struct?
ArrayOfValues[i].AnInt++;
//And then another again?
ArrayOfValues[i].AFloat += 0.33f;
/*I realise adding letters to a string is a horrible idea
-- but is it WORSE to do it in a struct?*/
ArrayOfValues[i].AString += "s";
}
}
因此,例如,如果我有一个结构,例如在3D / 2D空间内保持每个人的坐标(坐标是作为何时使用结构的一个例子),并且人们的位置发生变化,在一个两个/三个int结构中更新,从一个数组,是创建新的结构,因为它们是不可变的?
答案 0 :(得分:0)
结构不是不可变的,除非你将其中的字段设为只读。
public struct SomeValues
{
public readonly int AnInt;
public readonly float AFloat;
public readonly string AString;
}
答案 1 :(得分:0)
结构不是不可变的。 内存中的新对象不是在您更改时创建的,而是在将其分配给不同的变量或作为参数传递给某个方法时创建的。
答案 2 :(得分:0)
默认情况下,结构不不可变,设计结构以使行为不可变是一个非常好的主意。
对于不可变的结构/类来说:
答案 3 :(得分:0)
结构不是一成不变的。虽然有些人似乎认为应该这样,但大多数原因似乎分为三类:
当值类型语义有意义时,当有问题的实体是可变的时,使用结构,尤其是。考虑:
struct fancyRect {public int left,top,width,height; ....other stuff.... }; ... then within some code ... myList = List<fancyRect>; // Assume this list has been initialized somehow fancyRect tempRect = myList[0]; tempRect.left += 5; myList[0] = tempRect;
只需提供信息,就可以完全确定上述代码对myList内容的影响。如果属性可以通过引用公开,允许myList[0].left += 5
,那将更清晰,但结构的代码仍然清晰可读。假设tempRect是一个类。上面的代码有什么影响?它有其他影响吗?如何编写它以使其具有与结构相同的语义?