Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

"Private - это значение по умолчанию только для методы по типу"

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

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

Только для типов верхнего уровня.Для вложенных типов он является закрытым.

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

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

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

Видишь http://csharpindepth.com/ViewNote.aspx?NoteID=54 еще немного об этом.

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

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

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

Модификатор private объясняет намерение.

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

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

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

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

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

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

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

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

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

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

  • Пространства имен неявно имеют общедоступную объявленную доступность.Никакие модификаторы доступа не допускаются в объявлениях пространства имен.
  • Типы, объявленные в единицах компиляции или пространствах имен, могут иметь общедоступную или внутреннюю объявленную доступность и по умолчанию использовать внутреннюю объявленную доступность.
  • Члены класса может иметь любой из пяти типов объявленной доступности и по умолчанию использовать закрытую объявленную доступность.(Обратите внимание, что тип, объявленный как член класса, может иметь любой из пяти видов объявленной доступности, тогда как тип, объявленный как член пространства имен, может иметь только общедоступную или внутреннюю объявленную доступность.)
  • Члены структуры могут иметь общедоступную, внутреннюю или закрытую объявленную доступность и по умолчанию имеют закрытую объявленную доступность, поскольку структуры неявно закрыты.Элементы структуры, введенные в структуру (то есть не унаследованные этой структурой), не могут иметь защищенной или защищенной внутренней объявленной доступности.(Обратите внимание, что тип, объявленный как член структуры, может иметь общедоступную, внутреннюю или закрытую объявленную доступность, тогда как тип, объявленный как член пространства имен, может иметь только общедоступную или внутреннюю объявленную доступность.)
  • Члены интерфейса неявно имеют общедоступную объявленную доступность.Никакие модификаторы доступа не допускаются в объявлениях элементов интерфейса.
  • Члены перечисления неявно имеют общедоступную объявленную доступность.Никакие модификаторы доступа не разрешены в объявлениях членов перечисления.

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

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

Использование private явно сигнализирует о вашем намерении и оставляет подсказки для других, которые будут поддерживать ваш код ;)

Некоторые стили кодирования рекомендуют сначала помещать все "общедоступные" элементы, а затем "приватные" элементы.Без ключевого слова "private" вы не смогли бы сделать это таким образом.

Обновить:Я не заметил в этом теге "c #", поэтому мой ответ больше применим к C ++, чем к C #.

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

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

против:

int x;

public    string y;
protected float  z;

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

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

Так что, если вы хотите сделать это приватным, используйте private .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top