| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Как обращаетесь к своим полям (Property VS field)? |
| Автор: jonie 4.11.2008, 13:16 | ||
Итак, представим себе такой класс
суть одна и таже. А как вы предпочитаете общаться со своим классом и почему ? |
| Автор: 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 |
мне нечего возразить) третьм фреймворком еще не приходилось пользоваться. и про оптимизацию 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, да как бы и не утверждаю. Просто если свойства по затратам равны простым полям, то остальные аргументы сколняют в пользу свойств. А вот это: кажется лично тебе и ничем не потверждено. Не показателен - используй только поля, тебе же хуже. Ну, по крайней мере тебе же не лучше |
| Автор: jonie 6.11.2008, 10:56 | ||
вопрос в тему. в c# 3 можно писать так:
и объявлять даже приватный член не надо, само все создаст. в чем суть такого поля ? если убрать хотябы один метод (get или set) то поле станет бессмысленно так для чего его ввели ? ЗЫ: не читал пока про c# 3 ка следует, так что ткните носом.... |
| Автор: QryStaL 6.11.2008, 11:10 | ||
Так а зачем его убирать-то? Всегда используй оба аксессора. |
| Автор: PashaPash 6.11.2008, 13:36 | ||
jonie, смысл в том, что теперь можно задать модификатор доступа для аксессора.
|
| Автор: 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 перешли |