Как выбрать между приватным членом и пусть обязательным? - PullRequest
9 голосов
/ 15 октября 2011

Когда вы пишете закрытый метод, который не нуждается в доступе к другим членам того же класса, как вы выбираете между закрытым членом и разрешением связывания?

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

Ответы [ 3 ]

13 голосов
/ 15 октября 2011

Соответствующей частью спецификации является раздел 8.6.2 .В нем говорится:

Скомпилированное представление, используемое для значений, объявленных в привязках «let» в классах: либо:

  • Значение, локальное для конструктора объекта(если значение не является синтаксической функцией, не является изменяемым и не используется ни в одной функции или члене).

  • Поле экземпляра в соответствующем типе CLI (если значение не являетсясинтаксическая функция, но используется в некоторой функции или элементе).

  • Член соответствующего типа CLI (если значение является синтаксической функцией).

Также:

Нефункциональные привязки let, которые не используются ни в элементах типа, ни в привязке функций, оптимизируются и становятся значениями, локальными длярезультирующий конструктор CLI.Аналогично, привязки функций представляются как члены экземпляра.

Я предпочитаю привязки let закрытым членам, потому что они более «функциональны», т. Е. Они подчеркивают «что», а не «как».Компилятор позаботится об оптимальной скомпилированной форме.

6 голосов
/ 16 октября 2011

let привязки в классе являются частными.Основное различие между let и частным member, которое я думаю, заключается в том, что привязки let не могут быть перегружены и вызываются с name(), а не this.Name().Поэтому я думаю, что это в основном стилистический выбор.

2 голосов
/ 09 августа 2014

let привязки не могут быть доступны через экземпляр класса, но private method может. Например:

type A() =
    let someUtil() = "util code"

    member private this.AnotherUtil() = "anotherUtil"

    member private this.DoSomething() =
       let anotherA = A()
       A.someUtil()  // compilation failed
       A.AnotherUtil() // ok
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...