2013-11-16 3 views
1

Я создал структуру, которая имеет другую структуру как свойство. Я хочу быть в состоянии сделать что-то вроде этого:Настройка свойства свойства в структуре?

MyColor.RGBColor.R = 255; 

MyColor и RGBColor будучи структуры, которую я создал. Это не сработает, я установил совершенно новое значение для RGBColor, но это не просто, и должен быть более простой способ. В настоящее время, я должен сделать это:

MyColor.RGBColor = new RGBColor(255, MyColor.RGColor.G ...) 

Я уверен, что если бы я перестал encapsualting частные свойства в государственной собственности, и просто сделать их достоянием общественности, в первую очередь, я не буду иметь эту проблему .. но я всегда читал, что это плохо, но как я могу это сделать? Благодаря

EDIT:

Это, как я реализовать свойства в настоящее время:

private rgbcolor _RGBColor; 
public rgbcolor RGBColor { 
    get { 
    return _RGBColor; 
    } 
    set { 
    _RGBColor = value; 
    } 
} 
+0

Можете ли вы разместить больше кода, включая ваши структуры? – theoutlander

+0

@NickKarnik ok, я добавил способ настройки свойств – Oztaco

ответ

2

Ожидаемое поведение. Получив доступ к свойству RGBColor, вы вызываете его метод getter, который возвращает экземпляр структуры по значению. Несмотря на то, что тогда вы назначили (который, по сути, даже не компилирует) значение в R, сама структура не сохраняется обратно в собственность RGBColor - даже если у нее был сеттер. Это то, как ведут себя типы значений.

Если вы можете, просто избегайте использования структур. В мире классов с автоматическими ссылками и свойствами с методами геттера/сеттера они, как правило, очень противоречат интуиции. Попытка представить небольшие классы (с точки зрения размера данных) в виде структур: premature optimization.

Примечание: То, что вы называете "частной собственностью", - не недвижимость. Это поле участника.

+0

Я мог бы сделать это, но я стараюсь избегать того, чтобы мои цвета были ссылочным типом – Oztaco

+0

@ leaf68 Это преждевременная оптимизация. См. Мой обновленный ответ. Просто не делайте этого, если у вас действительно есть *. –

+0

Хорошо, есть ли способ сделать классы более похожими на типы значений, где «=» копирует его, а не делает ссылку? – Oztaco

0

Вы должны смотреть на съездах для имен классов против имен переменных. Кажется, у вас это несколько назад в вашей реализации.


Вот что я думаю, что вы пытаетесь сделать:

private rgbcolor _RGBColor = new rgbcolor(); 
public rgbcolor RGBColor { 
    get { 
    return _RGBColor; 
    } 
} 

После того, как это на месте, вы должны быть в состоянии сделать что-то подобное (при условии, что есть свойство R на RGBColor)

MyColor.RGBColor.R = 255; 

Это будет работать, потому что экземпляр для MyColor.RGBColor будет существовать при доступе к свойству RGBColor.

+0

Не избавился бы от 'set' сделать его доступным только для чтения? – Oztaco

+0

Предоставление 'rgbcolor' является структурой, это даже не компилируется ... –

0

Когда вы используете типы значений (structs), вы должны иметь в виду, что передача их в методы в качестве параметров или возврат из методов (также в некоторых других случаях) всегда вызывает создание копии этого объекта. Свойства - это только методы после компиляции. Так что ваш код фактически равный:

var copy = MyColor.RGBColor; // you get a copy now 
copy.R = 255; // and now you change a copy, not the original object's value 

C# compiller понимают, что это ошибка и не скомпилировать нужный вариант. Из-за этого настоятельно рекомендуется создать imutable structs. В вашем случае лучше использовать классы.

Смежные вопросы