Инкапсуляция, очевидно, полезна и важна при доступе к членам извне класса, но при обращении к переменным класса изнутри лучше вызывать их частные члены или использовать их геттеры? Если ваш метод получения просто возвращает переменную, есть ли разница в производительности?
Каковы преимущества внутреннего использования недвижимости?
Ответы (5)
Значительной разницы в производительности быть не должно, и причина, по которой вы придерживаетесь свойств, заключается в том, что в этом весь смысл инкапсуляции. Он поддерживает согласованность и контроль всех доступов этих частных участников. Итак, если вы хотите изменить средство получения / установки свойства, вам не нужно думать: «Нужно ли мне дублировать ту же функциональность в другом месте, в тех местах, где я решил напрямую получить доступ к частному члену?»
Доступ к полю напрямую или с помощью геттера обычно не имеет большого значения, если только ваш геттер не выполняет ленивую инициализацию или другую обработку. Так что это зависит от того, что делает геттер, но мое практическое правило - всегда использовать геттер, за исключением особых случаев.
Чтобы присвоить значение полю, не забывайте, что установщики часто включают код проверки или вызывают событие. В этом случае вы всегда должны использовать сеттер.
Преимущество будет в тех случаях, когда необходимо выполнить проверку Get или Set. Это было бы в одном месте и всегда звонили.
Насколько мне известно (из других вопросов, заданных в Stack Overflow), когда Getter просто возвращает значение, сгенерированный код совпадает с прямым доступом к переменной.
Разница в производительности незначительна, примерно в 98% случаев.
Вы всегда должны использовать свойства, даже если ваш геттер или сеттер просто получает или устанавливает ваш частный член. Это позволит вам вносить изменения по мере развития вашего приложения. Таким образом вы сможете ввести некоторые ограничения или инкапсуляцию в свои свойства без нарушения кода. В противном случае, если вы решите написать свойства по причине X, вы обнаружите, что вынуждены реорганизовать весь свой код, чтобы получить или установить свойство вместо вашего частного члена.
Мне нравится использовать внутренние свойства для ленивой инициализации, когда в свойстве вы должны убедиться, что объект инициализирован. Это гарантирует, что я не использую переменные уровня класса, которые еще не были инициализированы.
TestClass1 _class1
internal TestClass1
{
get
{
if (_class == null)
_class = new TestClass1()
return _class1
}
}