Свойства против полей: нужна помощь в понимании использования свойств над полями - PullRequest
35 голосов
/ 18 июня 2010

Во-первых, я прочитал список публикаций на эту тему, и я не чувствую, что я понял свойства из-за того, что я понял о инкапсуляции и модификаторах полей (private, public..ect).

Одним из основных аспектов C #, который я изучил, является важность защиты данных в вашем коде с помощью инкапсуляции.Я «думал», что понял, что это из-за способности использовать модификаторы (частные, публичные, внутренние, защищенные).Однако, узнав о свойствах, я в некотором роде разрываюсь с пониманием не только использования свойств, но и общей важности / способности защиты данных (что я понимаю как инкапсуляция) в C #.

Если быть более точным, все, что я прочитал, когда получил свойства в C #, это то, что вы должны стараться использовать их вместо полей, когда можете, из-за:

1) они позволяют вам изменять тип данных, когда вы не можете получить прямой доступ к полю напрямую.

2) они добавляют уровень защиты доступа к данным

Однако из того, что я «подумал», я узнал об использовании модификаторов поля, # 2, мне показалось, что свойства просто генерировали дополнительный код, если у вас не было какой-либо причины для изменения типа (# 1) -потому что вы (более или менее) создаете скрытые методы для доступа к полям, а не напрямую.

Затем можно добавить в свойства целые модификаторы, что еще больше усложняет мое понимание необходимости свойств для доступа к данным.

Я прочитал несколько глав от разных авторов по«Свойства», и ни один из них действительно не объяснил хорошего понимания свойств по сравнению с полями и инкапсуляцией (и хороших методов программирования).

Может кто-нибудь объяснить:

1) , почему я хотел бы использовать свойства вместо полей (особенно когда оно появляется, я просто добавляю дополнительный код

2) любые советы по распознаванию использования свойств ине рассматривает их как простые методы (за исключением get; устанавливает очевидность) при трассировке кода других людей?

3) Какие-либо общие правила, когда дело доходит до хороших методов программированияв связи с тем, когда использовать что?

Спасибо и извините за длинный пост - я не хотел просто задавать вопрос, который был задан 100х, не объясняя, почему я спрашиваю это снова.

Ответы [ 12 ]

1 голос
/ 18 июня 2010

Свойства позволяют вам делать что-то кроме установки или получать значение, когда вы их используете.В частности, они позволяют вам выполнять логику валидации.

Лучшая практика - сделать все, что открыто для общественности, собственностью.Таким образом, если вы позже измените логику set / get, вам нужно будет только перекомпилировать свой класс, а не каждый класс, связанный с ним.

1 голос
/ 18 июня 2010

Свойства являются предпочтительным способом покрытия полей для обеспечения инкапсуляции. Однако они функциональны в том смысле, что вы можете выставить свойство другого типа и маршалировать приведение; вы можете изменить модификаторы доступа; они используются в привязке данных WinForms; они позволяют встраивать легкую логику для каждого свойства, такую ​​как уведомления об изменениях; и т.д.

При взгляде на код других людей свойства имеют разные значки intellisense и методов.

Если вы считаете, что свойства - это просто дополнительный код, я бы все равно придерживался их, но упростил вашу жизнь, автоматически сгенерировав свойство из поля (щелкните правой кнопкой мыши -> Refactor -> Encapsulate Field ...)

...