事情是這樣的。
你這樣說:
我要離開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