事情是这样的。
你这样说:
我要离开Foo的结构。 我应该如何继续? foos [0] = tempFoo?有点复杂,只是 作业?!。
是的,就是这样。你需要的是赋值,而不是修改。值类型(结构)通常应被视为值。
以int
。如果您有一个List<int>
,名为ints
,您将如何更改ints[0]
的值?
就是这样的吧?
ints[0] = 5; // assignment
注意有没有办法做这样的事情:
ints[0].ChangeTo(5); // modification?
这是因为Int32
是一个不变的结构。它的目的是作为值,它不能被改变(所以int
变量只能被分配给新的东西)。
您的Foo
结构是一个令人困惑的案例,因为它可以被突变。但由于它是一种数值类型,因此只能传递副本(与int
,double
,等相同 - 我们定期处理的所有值类型)。由于这个原因,你不能改变“从远处”的实例 - 也就是说,除非它通过ref传递给你(在方法调用中使用ref
关键字)。
所以简单的答案是,是的,在List<Foo>
中更改Foo
,您需要将其分配给新的东西。但你真的不应该有一个可变的结构开始。
免责声明:几乎可以接受任何建议,在任何情况下,这都不是100%的硬性规定。非常熟练的开发人员Rico Mariani写了Point3d
结构,因为很好的原因可变,which he explained on his blog。但这是一个非常知情的开发人员知道完全是他在做什么;一般来说,作为编写值类型与引用类型的标准方法,值类型应该是不可变的。
在回答您的评论:所以当你是处理像Point
一个可变的结构,基本上你需要做这样的事情:
Point p = points[0];
p.Offset(0, 5);
points[0] = p;
,或者:
Point p = points[0];
points[0] = new Point(p.X, p.Y + 5);
原因我不会做...
points[0] = new Point(points[0].X, points[0].Y + 5);
...是,在这里你在points[0]
两次复制的价值。请记住,按索引访问this
属性基本上是一个方法调用。这样的代码确实是这样做的:
points.set_Item(0, new Point(points.get_Item(0).X, points.get_Item(0).Y + 5);
注意过度调用get_Item
(有一次额外的拷贝没有很好的理由)。
从根本上说,这是可变结构变为邪恶的另一种情况。拒绝吧。 – 2010-07-07 14:36:36