Есть ли причина писать ключевое слово private на C #?

109

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

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

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

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

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

Кроме того, есть случай , когда писать «частный» (один) будет изменять доступность элемента?

Камило Мартин
источник
18
IIRC, internalоднако, по умолчанию будет тип «верхнего уровня» .
Джефф Меркадо,
4
Как указано, значение по умолчанию для всего не является частным, и, как правило, лучше быть явным.
Джеймс Майкл Хэйр
По умолчанию все "максимально приватно". Очевидно, что невложенный класс не может быть частным, или ничто не может создавать или использовать его. Но члены по умолчанию являются частными, а вложенные классы по умолчанию являются частными. Все в C # по умолчанию имеет максимально ограниченный уровень видимости.
Райан Ланди

Ответы:

171

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

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

Также,

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

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

Рид Копси
источник
1
@Wayne: у него есть ответ с более высокой оценкой, чем у Джона Скита, но он этого не заслуживает ... Ответ Джона намного точнее.
aleroot
2
Это бессмысленное различие. Типы в пространстве имен по умолчанию являются внутренними, потому что по умолчанию они не могут быть частными; иначе ничто не могло их использовать. По умолчанию они по-прежнему настолько ограничены, насколько это возможно.
Райан Ланди
1
Доступность членов по умолчанию для классов и структур inisde является закрытой. Проверьте здесь: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Но элементов внутри пространства имен быть не может private.
Шимми Вайцхандлер
Кроме того , getи по setумолчанию доступность самого свойства
AustinWBryan
119

AFAIK, private по умолчанию везде в С #

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

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

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

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

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

Более того, есть ли случай, когда написание «приватный» (отдельно) изменит доступность члена?

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

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

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

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

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

Джон Скит
источник
+1. Использование не относящихся к делу ключевых слов для обозначения семантического намерения полезно, хотя в моем опыте работы с Java используется finalболее типичный пример.
jprete
1
@minitech: Обратное тоже работает, но менее полезно. Все это было введено в C # 2.
Джон Скит
20
Я, конечно, хотел бы, чтобы не было никаких значений по умолчанию, и компилятор просто выдавал ошибку, если модификатор доступа отсутствовал. Я не думаю, что большинство людей знают значения по умолчанию для каждой ситуации, что затем приводит к непреднамеренным ошибкам.
+1 "для вложенного типа по умолчанию приватно" - я просто знаю об этом, когда читал ваш ответ. Спасибо!
Нордин
5
@Phong, для C # есть одно простое правило: по умолчанию все настолько приватно, насколько это возможно. Элементы в пространстве имен, такие как невложенные классы, не могут быть частными, потому что ничто не может их использовать. Они могут быть только внутренними или публичными; поэтому по умолчанию они внутренние. Вещи внутри других вещей (перечисления внутри класса; вложенные классы; свойства; поля; методы ...) по умолчанию являются частными.
Райан Ланди
11

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

var answer = a + b / c;

Вы находите это непонятным без лишних скобок b / c?

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

Райан Ланди
источник
1
Раньше я соглашался с этим, прежде чем задавать вопрос. Но некоторые люди пишут VB, некоторые C ++, некоторые даже F # (возможно, из других функциональных языков, таких как Haskell?), Лучше, чем они это делают на C #. Так что для них (и для нас, если мы забудем об этом после 2 лет отсутствия C #) лучше, если методы доступа будут явными. Не недооценивайте влияние, которое легкое обучение оказывает на проект, многие разработчики имеют опыт, который может не отражать выбранный инструмент, и им действительно нужны учебные пособия, даже в производственном коде, это совсем неплохо (и мы знаем многих код очень плохой C #, поэтому нам тоже помогут некоторые вспомогательные средства).
Камило Мартин
3
Ну, конечно, в VB значения по умолчанию ужасны. Я думаю, что видимость по умолчанию Friend, например, предназначена для участников. C # правильно использует настройки видимости по умолчанию: все настроено на минимальную видимость, если они не изменены. Из того, что я могу найти, похоже, что то же самое верно и для C ++ (кроме структур). (Это не похоже на F #.)
Райан Ланди
6
Для меня странно, что так много людей поддерживают var, потому что это сокращает визуальный беспорядок, и все же так много людей поддерживают бессмысленный набор текста private.
Райан Ланди
2
Я бы даже пошел так далеко, чтобы утверждать, что визуальный беспорядок мешает читаемости!
binki
1
upvoted хотя я действительно предпочитаю использовать круглые скобки в случае вашего математического примера.
Marc.2377,
7

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

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

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

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

Я не люблю, когда все устанавливается неявно. Никогда не бывает так ясно, как когда они явно установлены.

Джей Ди Айзекс
источник
Звучит разумно, я даже забываю основы языков, которые когда-то знал лучше.
Камило Мартин,
6

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

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

Джеймс
источник
5

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

Maess
источник
Согласовано. Например, если вы работаете с другими разработчиками над небольшим количеством кода, установка чего-то частного помогает указать на ваше намерение. Это также полезно, когда вы возвращаетесь к своему коду через несколько лет, и ваша IDE может сказать вам, какие методы должны быть общедоступными для этого класса.
Аарон Ньютон,
3

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

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

Патрик Макдональд
источник
+1, я только что заметил, что FxCop жалуется на то, что я удаляю модификатор private, когда я построил с изменением.
Камило Мартин
2

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

davidtbernal
источник
1
Что ж, я бы не сказал, что «модификатор доступа по умолчанию private» - это загадочная деталь ... Но я понимаю суть. На днях мне было трудно вспомнить, как работал фреймворк, который я использовал на прошлой неделе ( MEF ).
Камило Мартин
0

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

MGZero
источник
4
Вы думаете о C ++. В C # даже в структурах члены по умолчанию являются закрытыми.
3
Структуры не имеют общедоступного доступа по умолчанию - см .: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Рид Копси,