Каковы преимущества внутреннего использования недвижимости?

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


person dlras2    schedule 21.05.2010    source источник
comment
попробуйте задать себе этот вопрос: если вы верите своему собственному утверждению (что я не вижу причин, почему вам не следует этого делать). Инкапсуляция, очевидно, полезна и необходима при доступе к членам извне класса, тогда попробуйте придумать веский аргумент в пользу того, почему все происходит. должно быть иначе, если вы удалили последние четыре слова. Если вы не знаете, вы можете использовать те же аргументы :)   -  person Rune FS    schedule 21.05.2010
comment
@ChrisF: эта тема практически не имеет отношения к этому вопросу   -  person fearofawhackplanet    schedule 21.05.2010
comment
Ссылка на вопрос, который оказался неактуальным, удален.   -  person ChrisF    schedule 21.05.2010
comment


Ответы (5)


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

person Daniel DiPaolo    schedule 21.05.2010

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

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

person Thomas Levesque    schedule 21.05.2010
comment
+1: Это хорошее практическое правило. Существует общая тенденция использовать частный член ... Я ничего не делаю в геттере и / или сеттере ... было бы бесполезно вызывать метод ... Я просто выполняю присваивание ... круто. (виноват .. Я признаю это) Затем позже вы или, что еще хуже, кто-то другой, добавляете некоторую проверку сеттеру и ... бьете ... своей мишенью в того, кто стрелял в встречу с кроликом. Как сказал Томас ... всегда есть место для особых случаев ... по привычке используйте сеттер. - person Rusty; 21.05.2010
comment
В любом случае, простые геттеры или сеттеры обычно встроены JIT-компилятором, так что это даже не оптимизация для прямого доступа к полю ... - person Thomas Levesque; 22.05.2010

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

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

person ChrisF    schedule 21.05.2010

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

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

person Will Marcouiller    schedule 21.05.2010

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

TestClass1 _class1
internal TestClass1
{

get
{

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

    return _class1

}

}
person dretzlaff17    schedule 21.05.2010