Есть ли причина написать ключевое слово "private" в C #? - PullRequest
105 голосов
/ 12 декабря 2011

Насколько я знаю, private - это значение по умолчанию везде в C # (что означает, что если я не напишу public, protected, internal и т. Д., Это будет private по умолчанию). (Пожалуйста, поправьте меня, если я ошибаюсь.)

Итак, в чем причина написания этого ключевого слова или почему оно вообще существует для членов?

Например, когда обработчик событий генерируется автоматически, он выглядит так:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Но почему он даже пишет private, если это подразумевается и используется по умолчанию? Просто чтобы начинающие разработчики (которые не знают, что это C # по умолчанию) знают, что это личное? Или есть разница для компилятора?

Кроме того, есть ли случай, когда написание "private" (одного) изменит доступность члена?

Ответы [ 9 ]

166 голосов
/ 12 декабря 2011

AFAIK, приватный - по умолчанию везде в C # (это означает, что если я не напишу публичный, защищенный, внутренний и т. Д., Он будет приватным по умолчанию).(пожалуйста, поправьте меня, если ошиблись).

Это не так.Типы, определенные в пространстве имен (классы, структуры, интерфейсы и т. Д.), Будут внутренними по умолчанию.Кроме того, члены в разных типах имеют разные права доступа по умолчанию (например, public для членов интерфейса).Подробнее см. Уровни доступности в MSDN.

Кроме того,

Итак, в чем причина написания этого ключевого слова или почему оно вообще существует?

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

117 голосов
/ 12 декабря 2011

AFAIK, приватный по умолчанию везде в C #

Не совсем - по умолчанию «наиболее ограниченный доступ для этой декларации». Так, например, для типа верхнего уровня по умолчанию используется значение internal; для вложенного типа по умолчанию используется private.

Итак, в чем причина написания этого ключевого слова или почему оно вообще существует?

Это делает это явным, что хорошо по двум причинам:

  • Это проясняет для тех, кто не знает значений по умолчанию, согласно вашему вопросу (лично мне никогда не нравился этот аргумент, но я подумал, что стоит упомянуть)
  • Создается впечатление, что вы сознательно решили сделать его приватным, а не просто использовать настройки по умолчанию.

Что касается вашей последней части:

Более того, есть ли случай, когда написание "private" (одного) изменит доступ участника?

Да, для того, чтобы сделать половину собственности более строгой, чем другую:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

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

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

11 голосов
/ 11 января 2012

private добавляет визуальный беспорядок. Тем, кто настаивает на том, что это делает вещи явными, я хотел бы спросить: Вы тоже делаете это с математикой? Например:

var answer = a + b / c;

Считаете ли вы это неясным без лишних скобок вокруг b / c?

Правило в C # очень простое: По умолчанию все максимально приближено к приватному. Так что если вам нужно, чтобы что-то было больше видимым, чем значение по умолчанию, добавить модификатор. В противном случае не добавляйте ненужные ключевые слова в свой код.

6 голосов
/ 13 декабря 2011

Насколько я знаю, частное является по умолчанию везде в C #

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

Нет «Я думаю, что это так», «Я уверен, что это так» и т. Д. Это просто.И все на одной странице.

Я не C # разработчик.Если бы мне пришлось работать с некоторым кодом, который не был явно объявлен private , я бы, вероятно, предположил, что это был внутренний .

Мне не нравится, когда все неявно устанавливается.Это никогда не так ясно, как когда они явно установлены.

6 голосов
/ 12 декабря 2011

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

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

5 голосов
/ 12 декабря 2011

Читаемость, демонстрация намерений - вот две большие причины, которые я могу придумать.

3 голосов
/ 12 декабря 2011

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

Другая веская причина в том, что FxCop говорит вам сделать это.

2 голосов
/ 31 декабря 2011

Многие люди (такие как я!) Регулярно программируют на нескольких языках.Ясность с такими вещами мешает мне помнить все таинственные детали всех языков, на которых я программирую.

0 голосов
/ 12 декабря 2011

Я бы сказал, что для согласованности с читаемостью остальной части класса.

...