Каковы преимущества использования свойств внутри? - PullRequest
5 голосов
/ 21 мая 2010

Инкапсуляция, очевидно, полезна и необходима при доступе к членам извне класса, но при обращении к внутренним переменным класса лучше ли вызывать их закрытые члены или использовать их получатели? Если ваш геттер просто возвращает переменную, есть ли разница в производительности ?

Ответы [ 5 ]

9 голосов
/ 21 мая 2010

Не должно быть существенной разницы в производительности, и причина, по которой вы придерживаетесь свойств, заключается в том, что в этом весь смысл инкапсуляции.Он обеспечивает постоянный и контролируемый доступ к этим частным пользователям.Поэтому, если вы хотите изменить свойство getter / setter, вам не нужно думать: «Нужно ли мне дублировать ту же функциональность в других местах в тех местах, где я решил получить прямой доступ к приватному члену?»

7 голосов
/ 21 мая 2010

Прямой доступ к полю или использование получателя обычно не имеет большого значения, если только ваш получатель не выполняет некоторую ленивую инициализацию или другую обработку. Так что это зависит от того, что делает получатель, но мое правило: всегда использовать получатель, за исключением особых случаев.

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

4 голосов
/ 21 мая 2010

Преимущество будет в тех случаях, когда необходимо выполнить проверку на получение или набор. Это было бы в одном месте и всегда называлось.

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

1 голос
/ 21 мая 2010

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

TestClass1 _class1
internal TestClass1
{

get
{

    if (_class == null)
     _class = new TestClass1()

    return _class1

}

}
1 голос
/ 21 мая 2010

Разница в производительности незначительна, примерно в 98% случаев.

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

...