Что делает модификатор "private"? - PullRequest
25 голосов
/ 26 сентября 2008

Учитывая, что "private" является модификатором доступа по умолчанию для членов класса, зачем вообще нужно ключевое слово?

Ответы [ 13 ]

68 голосов
/ 26 сентября 2008

Здесь есть определенное количество дезинформации:

"Модификатор доступа по умолчанию не частный, а внутренний"

Ну, это зависит от того, о чем ты говоришь. Для членов типа это личное. Для самих типов верхнего уровня это внутреннее.

"Частным является только значение по умолчанию для методов для типа"

Нет, по умолчанию для всех членов типа - свойства, события, поля, операторы, конструкторы, методы, вложенные типы и все, что я забыл.

"На самом деле, если класс или структура не объявлены с модификатором доступа, по умолчанию используется внутренний"

Только для типов верхнего уровня. Для вложенных типов это личное.

За исключением ограничения доступа к свойству для одной части, но не для другой, по умолчанию всегда используется «как можно более строгие ограничения».

Лично я размышляю над вопросом, быть ли явным. Преимущество использования по умолчанию заключается в том, что он подчеркивает, что вы делаете что-то более заметное, чем самый ограничительный уровень. «За» для явного указания его заключается в том, что оно более очевидно для тех, кто не знает вышеуказанного правила, и это показывает, что вы немного подумали об этом.

Эрик Липперт идет с явной формой, и я тоже начинаю склоняться таким образом.

Подробнее об этом см. http://csharpindepth.com/ViewNote.aspx?NoteID=54.

28 голосов
/ 26 сентября 2008

Это для вас (и будущих сопровождающих), а не для компилятора.

15 голосов
/ 26 сентября 2008

Ясность. Я никогда не использую значение по умолчанию и всегда явно добавляю модификатор.

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

Теперь я также использую ReSharper, который по умолчанию является явным, поэтому он только подтверждает и усиливает мою предвзятость:)

9 голосов
/ 26 сентября 2008

Частный модификатор объясняет намерение.

Закрытая переменная-член не предназначена для прямых манипуляций вне класса. Средства доступа get / set могут быть созданы или не созданы для переменной.

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

Модификатор private (и другие подобные) может быть полезным способом написания самодокументируемого кода.

7 голосов
/ 26 сентября 2008

Как отметил Джон Скит в своей книге C # В глубине , в C # есть одно место, где для достижения эффекта требуется ключевое слово private.

Если моя память работает правильно, то ключевое слово private - единственный способ создать средство получения или установки свойства с частной областью действия, когда его противоположность имеет большую, чем частная доступность. Пример:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

Для этого необходимо ключевое слово , необходимое , поскольку дополнительный модификатор доступности свойства может только сузить область действия, но не расширить ее. (В противном случае можно было бы создать частное (по умолчанию) свойство и затем добавить открытый модификатор.)

5 голосов
/ 26 сентября 2008

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

С Спецификация языка C # 3.0 (msdn) Раздел 3.5.1

В зависимости от контекста, в котором происходит объявление члена, разрешены только определенные типы объявленной доступности. Кроме того, когда объявление члена не включает никаких модификаторов доступа, контекст, в котором происходит объявление, определяет объявленную доступность по умолчанию.

  • Пространства имен неявно имеют общедоступную объявленную доступность. В объявлениях пространства имен запрещены модификаторы доступа.
  • Типы, объявленные в единицах компиляции или пространствах имен, могут иметь открытую или внутреннюю объявленную доступность и значение по умолчанию к внутренней заявленной доступности.
  • Члены класса могут иметь любой из пяти видов объявленной доступности и по умолчанию - частная объявленная доступность. (Обратите внимание, что тип, объявленный как член класса, может иметь любой из пяти видов объявленной доступности, тогда как тип, объявленный как член пространства имен, может иметь только открытую или внутреннюю объявленную доступность.)
  • Члены Struct могут иметь объявленную общедоступную, внутреннюю или частную объявленную доступность и по умолчанию использовать объявленную доступность private, поскольку структуры неявно запечатаны. Члены структуры, представленные в структуре (то есть не наследуемые этой структурой) не могут иметь защищенную или защищенную внутреннюю объявленную доступность. (Обратите внимание, что тип, объявленный как член структуры, может иметь открытую, внутреннюю или закрытую объявленную доступность, тогда как тип, объявленный как член пространства имен, может иметь только открытую или внутреннюю объявленную доступность.)
  • Члены интерфейса неявно имеют публичную объявленную доступность. В объявлениях членов интерфейса запрещены модификаторы доступа.
  • Члены перечисления неявно имеют публично объявленную доступность. В объявлениях членов перечисления запрещены модификаторы доступа.
3 голосов
/ 26 сентября 2008

Для комплектации. И некоторые люди предпочитают в своих кодах явно указывать модификаторы доступа в своих методах.

2 голосов
/ 26 сентября 2008

Для симметрии и соответствия стилям кодирования, которым нравится все, чтобы быть явным (лично мне это нравится ...)

1 голос
/ 26 сентября 2008

Как сказал Роберт Полсон в своем ответе, модификатор private используется не только для членов, но и для типов . Это становится важным, потому что по умолчанию для типов internal, что может привести к непреднамеренной утечке при использовании InternalsVisibleToAttribute .

1 голос
/ 26 сентября 2008

Я обычно оставляю приватный, но нахожу это полезным для выстраивания кода:

private   int    x;
public    string y;
protected float  z;

VS:

int x;

public    string y;
protected float  z;
...