Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как обращаетесь к своим полям (Property VS field)?


Автор: jonie 4.11.2008, 13:16
Итак, представим себе такой класс
Код

class Some{
 private int a;

 public int A {
   get { return a; }
 }

 /*
  используем field напрямую
 */
 public int foo() {
  return a*2;
 }

 /*
  используем свойство
 */
 public int foo2() {
  return A*2;
 }

}

суть одна и таже.
А как вы предпочитаете общаться со своим классом и почему ?

Автор: Bogdan1024 4.11.2008, 13:32
Дык, свойства не пложу лишний раз если без них можно обойтись. Но в интерфейсах без них никак.

Автор: elbjarn 4.11.2008, 13:45
я предпочитаю обращаться напрямую к полю класса, а не свойству. по ряду причин.
умозрительная причина:
1. поле класса - это принадлежащая ему внутренняя характеристика. это его собственность, деталь реализации. поэтому он ей и пользуется напрямую. он предоставляет свойство (property) для доступа к этому полю для внешних сущностей (классов, функций), чтобы гарантировать, что он сам будет контролировать, каким образом внешние сущности получают доступ к этому полю (и получают ли вообще). поэтому не вижу смысла в функции класса обращаться к полю этого класса через свойство. напротив, ему должны быть доступны все детали реализации себя самого.
прагматическая причина:
2. свойство - фактически, парный набор функций, геттер и сеттер. вызов функции - всегда более дорогостоящее предприятие, чем обращение к переменной в памяти. не вижу смысла занимать лишние такты процессора выполнением функций, выполняющих доступ к переменным класса, если обращение к ним идет внутри самого класса, который по идее должен знать, как с ними обращаться.
3. наконец, вы можете захотеть внутри каких-то функций класса сделать с полем нечто такое, чего нельзя сделать через свойство. например, сеттер запрещает установку значения поля меньше 0, а вам по каким-то причинам (неважно, по каким) понадобится сделать его -1. или у вас свойство доступно только для чтения, а вам надо в него что-то записать. 

Автор: PashaPash 4.11.2008, 14:34
elbjarn, контрпричины:
1. Реализация DependencyProperties, на которые все завязано в 3/3.5, требует явного вызвова свойств. То же с INotifyPropertyChanged.
2. Вызовы get/set инлайнятся jit-ом. Потери производительности - миф и преждевременная оптимизация.
3. Можно выставить разные модификаторы доступа к set/get. Если по каким-то причинам нельзя выставить -1, то где-то уже написан код который не ожидает от геттера значения -1. И наверняка упадет. И вообще - сниппеты prop/propg рулят.
4. Свойства очень упрощают отладку. В VS (пока) нельзя ставить data breakpoints, и очень тяжело  изменение значения поля. А поставить bp на сеттер - пару кликов.

Автор: elbjarn 4.11.2008, 15:32
Цитата(PashaPash @  4.11.2008,  14:34 Найти цитируемый пост)
elbjarn, контрпричины:

мне нечего возразить)
третьм фреймворком еще не приходилось пользоваться. и про оптимизацию jit-ом обращений к свойствам не знал, хотя мог бы догадаться...

Автор: Dims 4.11.2008, 22:58
Мне кажется, данный пример не показателен. Свойство нужно тогда, когда оно делает что-то сложное. В этом случае может быть выгода от его использования, так как исключается повторная писанина.

Я делаю так. По возможности стараюсь использовать данные, которые лежат за свойствами. А если это очень накладно с точки зрения писанины, то использую свойства.


Автор: PashaPash 5.11.2008, 15:10
Dims, prop Tab Tab - и никакой писанины. Писанина - это в java.

3-й вариант ес-но, без фанатизма

Автор: Dims 5.11.2008, 18:28
Сниппеты есть и в других средах, не надо думать, что это Микрософт изобрёл колесо ;)

Автор: PashaPash 5.11.2008, 19:03
Dims, да как бы и не утверждаю. Просто если свойства по затратам равны простым полям, то остальные аргументы сколняют в пользу свойств. А вот это:
Цитата(Dims @  4.11.2008,  22:58 Найти цитируемый пост)
Мне кажется, данный пример не показателен.

кажется лично тебе и ничем не потверждено. Не показателен - используй только поля, тебе же хуже. Ну, по крайней мере тебе же не лучше smile

Автор: jonie 6.11.2008, 10:56
вопрос в тему. в c# 3 можно писать так:
Код

class some{
 public object ProperyName { get; set;}
}

и объявлять даже приватный член не надо, само все создаст.
в чем суть такого поля ?
если убрать хотябы один метод (get или set) то поле станет бессмысленно
так для чего его ввели ?

ЗЫ: не читал пока про c# 3 ка следует, так что ткните носом....

Автор: QryStaL 6.11.2008, 11:10
Цитата(jonie @  6.11.2008,  10:56 Найти цитируемый пост)
если убрать хотябы один метод (get или set) то поле станет бессмысленно

Так а зачем его убирать-то?
Всегда используй оба аксессора.

Автор: PashaPash 6.11.2008, 13:36
jonie, смысл в том, что теперь можно задать модификатор доступа для аксессора.
Код

        public int MyProperty { get; private set; }

Автор: Partizan 6.11.2008, 13:39
PashaPash, 
Цитата

теперь можно


Это было ещё до C# 3.0
раньше тоже это не вызывало никаких проблем.

Автор: PashaPash 6.11.2008, 15:41
Partizan, для некоторых теперь - это 2.0, а раньше - это 1.1 :(

Автор: Partizan 6.11.2008, 17:29
PashaPash, мои соболезнования...эээ...или наоборот поздравления...
кароче наверно поздравления, что некоторые с 1.1 теперь на 2.0 перешли smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)