гайка
Гость
|
|
« : 31-05-2012 12:28 » |
|
Очень много раз встречала примерно вот такое объявление переменной private ImageList imageList; public ImageList ImageList { get {return imageList;} set {imageList = value;} } В чем сакральный смысл объявления приватной переменной и создания ее публичного дубликата, разрешающего чтение и запись в ту самую приватную переменную?
|
|
« Последнее редактирование: 31-05-2012 12:47 от Гайка »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 31-05-2012 12:40 » |
|
Азы ООП - инкапсуляция переменной состояния класса в открытое "свойство" класса и доступ к ней посредством пары аксессор+мутатор.
Сакральный смысл состоит в возможности полного контроля внешнего доступа к состоянию класса.
"Дубликат" автоматически создается встроенными в Visual Studio средствами рефакторинга (Refactor -> Incapsulate Field).
|
|
« Последнее редактирование: 31-05-2012 12:55 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
гайка
Гость
|
|
« Ответ #2 : 31-05-2012 12:46 » |
|
О, вот последнее замечание очень дельное. не знала, дякую
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #3 : 31-05-2012 12:53 » |
|
Лишнее подтверждение того, насколько в действительности важна эта "сладкая парочка", что даже ее создание не поленились автоматизировать.
Добавлено через 5 минут и 12 секунд: Кстати, еще вариант использования: мутатор set допускается либо вовсе опустить (тогда свойство доступно только для чтения, непосредственно изменить его клиент не может), либо сделать его закрытым/защищенным (тогда его могут менять методы класса/производных классов).
|
|
« Последнее редактирование: 31-05-2012 12:58 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zubr
Гость
|
|
« Ответ #4 : 31-05-2012 12:59 » |
|
Говоря по простому, в методах get, set можно производить какие то множественные команды, к примеру инициализации и проверки (в вышеуказанном примере - простейший случай). А для пользователя класса, будет видно только свойство ImageList, которое можно читать и в которое можно записывать.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #5 : 31-05-2012 13:00 » |
|
Инициализацию нельзя, этим занимается конструктор.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
гайка
Гость
|
|
« Ответ #6 : 31-05-2012 13:06 » |
|
Инициализацию нельзя, этим занимается конструктор.
скорее не "нельзя", а "не желательно" и "не лицеприятно".
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #7 : 31-05-2012 13:12 » |
|
Иногда приходится в методах get, set инициализировать придавать значение каким то другим связанным с данным свойством членам класса.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #8 : 31-05-2012 13:15 » |
|
скорее не "нельзя", а "не желательно" и "не лицеприятно". Если объект имеет семантику значения, то именно нельзя - ошибка компиляции. Еще можно нарваться на неприятности, если свойство полиморфно. Лучше не выделываться и явно присвоить значения переменным состояния при создании экземпляра в конструкторе. Мутатор использовать только в случае, если нужно поменять состояние класса после создания. P.S. Иллюстрация к вышесказанному: struct Test { private int i;
public int I { get { return i; } set { i = value; } }
public Test(int n) { I = n; } } вызывает ошибку компиляции: The 'this' object cannot be used before all of its fields are assigned to
|
|
« Последнее редактирование: 31-05-2012 13:32 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 31-05-2012 16:28 » |
|
Свойства удобны для "ленивого" конструирования объектов. Например: class C { private object x;
public object X { get { if (this.x == null) { this.x = new object(); } return this.x; } }
public C() { this.x = null; } } Содержимое объекта создаётся не ранее, чем где-нибудь понадобится.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
гайка
Гость
|
|
« Ответ #10 : 31-05-2012 16:36 » |
|
Dale, это произходит из-за того, что переменная не была инициализирована в конструкторе?
Добавлено через 1 минуту и 46 секунд: Dimka, идея интересная, только не могу придумать случая, когда это может понадобиться
|
|
« Последнее редактирование: 31-05-2012 16:37 от гайка »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 31-05-2012 16:57 » |
|
Гайка, да хоть в твоих комбобоксах, если список длинный, картинки подгружаются извне, а юзер не стал листать до конца. Гораздо удобнее подгружать картинки по мере потребности, нежели все сразу.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dale
|
|
« Ответ #12 : 31-05-2012 17:23 » |
|
Dale, это произходит из-за того, что переменная не была инициализирована в конструкторе? Совершенно верно. Вообще использование методов объекта (а аксессоры и мутаторы тоже являются методами) до того, как объект создан (то есть до окончания работы конструктора) чревато неприятными сюрпризами (не только в C#, это достаточно общее правило). Ну и вдобавок нужно четко отличать инициализацию от присваивания (это принципиально разные вещи, и инициализация отнюдь не является присваиванием первого значения) и привыкать инициализировать объект в момент создания посредством конструктора, а не присваиваниями значений полям после создания.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
|