Color
- это структура в C #, которая копируется во время присвоений.Это означает, что при назначении:
clr[0,0] = form1.btn1Color;
Назначается копия значения form1.btn1Color
для clr[0,0]
.Таким образом, когда вы говорите:
clr[0,0] = Color.Aqua;
Вы перезаписываете копию, а не оригинал.
На самом деле, даже если Color
было бы class
вместо struct
, результат был бы таким же, потому что в этом случае вы перезаписали бы ссылку.
Если выЕсли вы хотите присвоить массив для изменения исходного объекта, вам нужно будет обернуть объект в массиве для обращения к исходному объекту, в котором содержится член, содержащий Color
, поскольку Color
является неизменным struct
.
Обновление : основываясь на вашем последующем вопросе, одна вещь, которую вы могли бы сделать (есть много способов сделать это), это обернуть 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
s btn1Color
member теперь 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;