Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: C# get & set  (Прочитано 5071 раз)
0 Пользователей и 1 Гость смотрят эту тему.
гайка
Гость
« : 31-05-2012 12:28 » 

Очень много раз встречала примерно вот такое объявление переменной
Код: (C#)
    private ImageList imageList;
    public ImageList ImageList
    {
      get {return imageList;}
      set {imageList = value;}
    }

В чем сакральный смысл объявления приватной переменной и создания ее публичного дубликата, разрешающего чтение и запись в ту самую приватную переменную?
« Последнее редактирование: 31-05-2012 12:47 от Гайка » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 31-05-2012 12:53 » 

Лишнее подтверждение того, насколько в действительности важна эта "сладкая парочка", что даже ее создание не поленились автоматизировать.

Добавлено через 5 минут и 12 секунд:
Кстати, еще вариант использования: мутатор set допускается либо вовсе опустить (тогда свойство доступно только для чтения, непосредственно изменить его клиент не может), либо сделать его закрытым/защищенным (тогда его могут менять методы класса/производных классов).
« Последнее редактирование: 31-05-2012 12:58 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #4 : 31-05-2012 12:59 » 

Говоря по простому, в методах get, set можно производить какие то множественные команды, к примеру инициализации и проверки (в вышеуказанном примере - простейший случай). А для пользователя класса, будет видно только свойство ImageList, которое можно читать и в которое можно записывать.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 31-05-2012 13:00 » 

Инициализацию нельзя, этим занимается конструктор.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
гайка
Гость
« Ответ #6 : 31-05-2012 13:06 » 

Инициализацию нельзя, этим занимается конструктор.
скорее не "нельзя", а "не желательно" и "не лицеприятно".
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #7 : 31-05-2012 13:12 » 

Иногда приходится в методах get, set инициализировать придавать значение каким то другим связанным с данным свойством членам класса.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 31-05-2012 13:15 » 

скорее не "нельзя", а "не желательно" и "не лицеприятно".

Если объект имеет семантику значения, то именно нельзя - ошибка компиляции.

Еще можно нарваться на неприятности, если свойство полиморфно. Лучше не выделываться и явно присвоить значения переменным состояния при создании экземпляра в конструкторе. Мутатор использовать только в случае, если нужно поменять состояние класса после создания.

P.S. Иллюстрация к вышесказанному:

Код: (C#)
    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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 31-05-2012 16:28 » 

Свойства удобны для "ленивого" конструирования объектов. Например:
Код: (C#)
        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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 31-05-2012 16:57 » 

Гайка, да хоть в твоих комбобоксах, если список длинный, картинки подгружаются извне, а юзер не стал листать до конца. Гораздо удобнее подгружать картинки по мере потребности, нежели все сразу.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 31-05-2012 17:23 » 

Dale, это произходит из-за того, что переменная не была инициализирована в конструкторе?

Совершенно верно. Вообще использование методов объекта (а аксессоры и мутаторы тоже являются методами) до того, как объект создан (то есть до окончания работы конструктора) чревато неприятными сюрпризами (не только в C#, это достаточно общее правило). Ну и вдобавок нужно четко отличать инициализацию от присваивания (это принципиально разные вещи, и инициализация отнюдь не является присваиванием первого значения) и привыкать инициализировать объект в момент создания посредством конструктора, а не присваиваниями значений полям после создания.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines