Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Свойства

76K
24 мая 2013 года
brudor
27 / / 17.04.2013
Привет! Я так понял, что они нужны для того чтобы было удобно работать с состоянием некоторого поля класса непосредственно через эти свойства, а не на прямую, верно? Формально, свойство это вовсе не поле класса, это просто набор из 2 методов, только вот почему я не могу явно вызывать эти методы из кода? Можно ли привести пример, когда свойство не привязано к конкретному объекту когда это было бы полезно? Спасибо!
414
24 мая 2013 года
CassandraDied
763 / / 24.05.2012
Свойства сделаны не для простого удобства, а для увеличения безопасности. Можно было бы и функции использовать, но писать постоянно obj.SetValueN(new_value) — не кошерно. В геттерах и сеттерах проверятеся корректность присваиваемого значения и что-то там полезное делалось, когда значение получалось — уже не помню, что именно.
Цитата:
Можно ли привести пример, когда свойство не привязано к конкретному объекту когда это было бы полезно?


Синглтон, например. Ну, либо фабрика абстрактных объектов, хех.
Алсо, у Троелсена было немало примеров в книге, как можно извратиться с операторами доступа.

76K
25 мая 2013 года
brudor
27 / / 17.04.2013
Цитата: CassandraDied
Можно было бы и функции использовать, но писать постоянно obj.SetValueN(new_value) — не кошерно.


Т.е. явно реализовать эти две функции гет/сет, понятно, спасибо. Вообще определить мы можем сколь угодно много свойств и через эти свойства в дальнейшем взаимодействовать с полем, подбирая нужное в зависимости от ситуации, верно?

Хотел бы разобрать на конкретном примере:Класс DirectoryInfo и его свойство GetFiles, которое возвращает список объектов FileInfo. Я создал объект класса DirectroyInfo и получаю список файлов этим свойством. Не понятно, к какому полю это свойство привязано, если вообще к какому-то привязано или нас это, в принципе, не сильно интересует? Известно только, что будет перехвачено DirectoryNotFoundException, это и есть та защита?

P.S. За Троелсена отдельное спасибо!

414
25 мая 2013 года
CassandraDied
763 / / 24.05.2012
Цитата:
Вообще определить мы можем сколь угодно много свойств и через эти свойства в дальнейшем взаимодействовать с полем, подбирая нужное в зависимости от ситуации, верно?


Какое-то у тебя странное отношение к операторам доступа. Свойств должно быть столько, сколько у тебя приватных переменных, к которым ты хочешь предоставить доступ. Эти переменные могли бы быть и публичными, но тогда какой-нибудь программист Василий захотел бы проинициализировать переменную типа String переменной иного типа через оператор присваивания. Ты — умный чувак и предусмотрел такую возможность, сделал переменную приватной, а для доступа к ней написал сеттер, в котором проверяешь тип присваемого значения, устанавливаешь, что он не String и в этом случае конвертируешь присваиваемое значение к String, чтобы ничего не сломалось. А Василий даже знать ничего об этом не будет, ну, ему оно и не нужно. А вот если Василий постарался передать вместо String, например, Dictionary и ты понимаешь, что к строке его ну никак не привести, то бросаешь исключение, либо присваиваешь значение поумолчанию(например, String,Empty) вместо того, которое присвоил Василий. И опять же, Васю не интересует, что там происходит внутри.

Цитата:
будет перехвачено DirectoryNotFoundException, это и есть та защита?


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

76K
25 мая 2013 года
brudor
27 / / 17.04.2013
Цитата: CassandraDied

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


Теперь вроде понятно. Представляю себе это так: Пусть есть участок кода

Код:
private int number;
        public int Number
        {
            get
            {
                return number;
                throw new DirectoryNotFoundException();
            }
            set
            {
                if (value<5) number=value;
            }
        }
То место, где я буду вызывать метод get я помещу в try/catch, соответсвенно к методу set это не имеет никакого отношения. Если я попытаюсь присвоить полю number значение больше 5 то в number откуда-то появляется 0, я его нигде в number Не запеихивал, откуда?
326
25 мая 2013 года
sadovoya
757 / / 19.11.2005
Полный бред :) Это про код. А насчет number -- вы и должны его обнулять при попытке задать некорректное значение (либо написать подходящую реакцию, например, выбросить исключение.).
76K
25 мая 2013 года
brudor
27 / / 17.04.2013
Цитата: sadovoya
Полный бред :) Это про код.


Почему?

Цитата: sadovoya
А насчет number -- вы и должны его обнулять при попытке задать некорректное значение (либо написать подходящую реакцию, например, выбросить исключение.).


Может и должен, но я не обнуляю, поэтому и спрашиваю почему number=0 при попытке присвоить некорректное знаечение?

326
26 мая 2013 года
sadovoya
757 / / 19.11.2005
Значит там ноль и был. А ваш set при вводе некорректного значения ничего не делает вообще (значит оставляет старое значение). Откуда уже был ноль? Хотябы из-за начальной инициализации int нулем (если вы явно его не инициализировали сами, то компилятор это сделал при объевлении сам). Далее за вас он ничего делать не будет. Поэтому в сет надо добавить обнуление для некорректного ввода, либо генерацию исключения. И может, я совсем пень в C#, но мне кажется, что в вашем гете throw вообще никогда не вызовется, раз стоит после return? И зачем он там стоит без всякого if-а?.

Цитата:
Можно ли привести пример, когда свойство не привязано к конкретному объекту



Свойства с ключевым словом static можно использовать даже без создания объекта.

P.S. Обычно за свойством стоит приватное поле. Св-во дает защищенный от ошибок способ доступа к нему. Но, формально свойство не обязано быть "привязано" к конкретной переменной. Скажем гетом можно отдавать какую-нибудь информацию об объекте, но не всегда ее нужно хранить внутри поля объекта. Не слишком полезный пример: гетом возвращать время, прошедшее от момента создания объекта в программе или имя класса и т.п.

414
26 мая 2013 года
CassandraDied
763 / / 24.05.2012
brudor, что, Троелсен не помог?
341
26 мая 2013 года
Der Meister
874 / / 21.12.2007
Свойства C#, как и свойства Delphi/C++ Builder или VB, введены для привязки данных к элементам управления.
414
26 мая 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: Der Meister
Свойства C#, как и свойства Delphi/C++ Builder или VB, введены для привязки данных к элементам управления.


Это как бы смысл парадигмы, нет?

326
26 мая 2013 года
sadovoya
757 / / 19.11.2005
Цитата:
Свойства C#, как и свойства Delphi/C++ Builder или VB, введены для привязки данных к элементам управления.


Скорей всего. События тоже.

На счет парадигмы не понял. Слишком мелкие это вещи для парадигм.

414
26 мая 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: sadovoya
Слишком мелкие это вещи для парадигм.


Вон из профессии. То есть, ты не считаешь, что свойства объектов — это инкапсуляция данных? Или не знаешь этого? Или мы говорим о разном?

326
26 мая 2013 года
sadovoya
757 / / 19.11.2005
Видимо о разном. В C++ свойства в смысле C# отсутствуют (может в новом стандарте появились, не помню). Тем не менее с инкапсуляцией там порядок. Свойства -- просто "наворот" над уже имевшимися в ООП средствами.
414
26 мая 2013 года
CassandraDied
763 / / 24.05.2012
Вот как...А чем свойства шарпа отличаются от свойств плюсов?
326
26 мая 2013 года
sadovoya
757 / / 19.11.2005
В С++ свойства моделируются обычными членами-функциями: закрытой переменной в ее обслуживание дают их одну-две -- то, что Вы назвали "некошерным".:)

P.S. Формально в терминалогии С++ свойств и нет. Там члены-данные, члены-функции. Но часто используют и терминалогию других языков, там, где это недоразумений не вызывает. Похоже последнее встречается :)
414
26 мая 2013 года
CassandraDied
763 / / 24.05.2012
Гм, пожалуй, да. В ++ это называется всё-таки не свойствами. Я почему-то подумал, что члены класса можно назвать свойством. Но это разные вещи и я ошибся.
326
26 мая 2013 года
sadovoya
757 / / 19.11.2005
Да я бы не назвал и это ошибкой. Тут дело терминологии. В ООП можно встретить фразы типа: объект -- набор свойств и методов их обслуживания (т.е. данные и функции) и т.п. Еще данные могут называть полями, а ф-ции -- методами. Пока нет стандарта на эти определения, общие для ООП. Все контекстно зависимо от конкретного языка.

Кстати о той-же терминологии. Встречал на форуме, что пишут "метод класса" имея ввиду метод, описанный в классе. Дельфи-программиста это напряжет: методом класса в Дельфи называют метод, который "общее достояние" всего класса, а не объекта. Он может вызываться без объекта и даже без создания объекта --- то, что в C++ имеют ввиду, объявляя функцию с ключевым словом static.
414
27 мая 2013 года
CassandraDied
763 / / 24.05.2012
Я тут погуглил MSDN и узнал, что он называет словом property именно ту сигнатуру, которая пишется для accessor'ов, а не переменные, которые объявляются внутри класса как закрытые. А если заглянуть на википедию, то там пишут, что статические переменные называются class variable(class member, field), а вот нестатические — instance variable(что вообще можно редко встретить в русскоязычном разговоре). Ну, та же википедия называет class variable как поле или свойство, но в английском языке ясное разделение: поле класса — это static, не static переменная — это всегда поле instance, так что в английском немного проще с терминологией.
Цитата:
Кстати о той-же терминологии. Встречал на форуме, что пишут "метод класса" имея ввиду метод, описанный в классе. Дельфи-программиста это напряжет: методом класса в Дельфи называют метод, который "общее достояние" всего класса, а не объекта.


Оу, не знал, что у дельфийцев есть такое.

Цитата:
Пока нет стандарта на эти определения, общие для ООП.


Надо поискать что-нибудь у google на эту тему, кто-то же должен был придумать хоть какую-то натацию, которой кто-нибудь придерживается.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог