Color
是C#中的一個結構,它在賦值過程中被複制。這意味着,當你分配:
clr[0,0] = form1.btn1Color;
它指定的form1.btn1Color
到clr[0,0]
值的副本。因此,當你說:
clr[0,0] = Color.Aqua;
你正在覆蓋副本,而不是原來的。
實際上,即使Color
是class
而不是struct
,結果也是一樣的,因爲在這種情況下,您會覆蓋參考。
,如果你想分配陣列修改原來的對象,你就需要包裝的對象數組指回到了持有Color
成員原來的對象,因爲Color
是一個不可變struct
。
更新:根據你的跟進問題,有一件事你可能 DO(實際上有很多方法可以做到這一點)被包裹Color
在一個包裝類,並使用該包裝的陣列和在form1
成員,以及:
public class ColorHolder
{
// construct ColorHolder from Color
public ColorHolder(Color color)
{
Current = color;
}
// can assign ColorHolder to Color with implicit conversion
public static implicit operator Color(ColorHolder value)
{
return value.Current;
}
// get or set current color
public Color Current { get; set; }
}
然後,更改form1.btn1Color
爲ColorHelper
,而不是Color
這一點也適用:
ColorHolder[,] clr = new ColorHolder[50, 50];
// sets current color of btn1Color to black.
form1.btn1Color = new ColorHolder(Color.Black);
// assign array location to the color holder
clr[0, 0] = form1.btn1Color;
// this changes the current color of form1's btn1Color
clr[0, 0].Current = Color.Aqua;
注意:你可以還允許從Color
轉換 - >ColorHolder
爲好,但是這可能會導致難以跟蹤的錯誤,因爲它能夠:
clr[0,0] = Color.Aqua;
這將分配新ColorHolder
而不是改變現有使用Current
。因此,我會避免Color
- >ColorHolder
轉換,並堅持像上面的東西。
你甚至可以概括這個Holder
代碼來支持任何類型的,如:
public class Holder<T>
{
public Holder(T value)
{
Value = value;
}
public static implicit operator T(Holder<T> holder)
{
return holder.Value;
}
public T Value { get; set; }
}
然後,而不是ColorHolder
你不得不Holder<Color>
或任何其他類型。同樣,這會像下面的使用(的假設form1
btn1Color
成員現在Holder<Color>
):
Holder<Color>[,] clr = new Holder<Color>[50, 50];
form1.btn1Color = new Holder<Color>(Color.Black);
clr[0, 0] = form1.btn1Color;
// sets the Color in form1.btn1Color to Aqua...
clr[0, 0].Value = Color.Aqua;
'是否有一個C#限制從數組設置表單屬性?' - TBH,這不會是我的第一個猜測... –