Подтвердить что ты не робот

Что делает модификатор "private"?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

"Приватное - только значение по умолчанию для методов типа"

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

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

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

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

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

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

См. Http://csharpindepth.com/ViewNote.aspx?NoteID=54, чтобы узнать больше об этом.

Ответ 3

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

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

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

Ответ 4

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

Частная переменная-член не предназначена для прямой манипуляции вне класса. get/set accessors могут создаваться или не создаваться для переменной.

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Обновление: я не заметил тег "С#", поэтому мой ответ больше относится к С++, чем к С#.

Ответ 10

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

Ответ 11

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

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

VS:

int x;

public    string y;
protected float  z;

Ответ 12

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

Ответ 13

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

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