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

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

Предоставлено вам отделом резервирования по резервированию!

Brad Wilson 26.09.2008 06:53

@Kiwi: насчет вашего редактирования - это тоже по умолчанию для классов, а не только для членов класса, верно?

Esteban Araya 26.09.2008 06:55

По умолчанию классы являются внутренними, а не частными.

Brad Wilson 26.09.2008 06:56

Брэд: Это должен быть «отдел резервирования» :)

Lars Mæhlum 26.09.2008 16:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
4
3 466
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

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

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

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

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

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

Гм, видимость не модальна в C#, как в C++. Ключевое слово private необходимо в тех случаях, когда оно не является значением по умолчанию (а бывают такие моменты, например, объявления классов), но размещение слова «private» перед методом действительно излишне и ненужно.

Brad Wilson 26.09.2008 06:52

Это правда, но на самом деле в вопросе не упоминается C#.

Greg Hewgill 26.09.2008 07:02

О, совершенно верно! Легко пропустить кусочки среднего синего на пастельно-синем.

Greg Hewgill 26.09.2008 07:45

Давай, у тебя 6000 репутации. То, как работает система, не может вас удивить. :)

Brad Wilson 26.09.2008 08:46

Я не могу быть «самым быстрым стрелком на западе», если перестану читать бирки! :)

Greg Hewgill 26.09.2008 16:09

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

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

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

если тип не вложен, он по умолчанию является внутренним, а невложенные типы не могут быть объявлены частными (для чего они будут частными, кроме внутренней видимости?)

Mark Cidade 26.09.2008 08:05

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

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

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

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

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

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

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

Depending on the context in which a member declaration takes place, only certain types of declared accessibility are permitted. Furthermore, when a member declaration does not include any access modifiers, the context in which the declaration takes place determines the default declared accessibility.

  • Namespaces implicitly have public declared accessibility. No access modifiers are allowed on namespace declarations.
  • Types declared in compilation units or namespaces can have public or internal declared accessibility and default to internal declared accessibility.
  • Class members can have any of the five kinds of declared accessibility and default to private declared accessibility. (Note that a type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
  • Struct members can have public, internal, or private declared accessibility and default to private declared accessibility because structs are implicitly sealed. Struct members introduced in a struct (that is, not inherited by that struct) cannot have protected or protected internal declared accessibility. (Note that a type declared as a member of a struct can have public, internal, or private declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
  • Interface members implicitly have public declared accessibility. No access modifiers are allowed on interface member declarations.
  • Enumeration members implicitly have public declared accessibility. No access modifiers are allowed on enumeration member declarations.

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

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

ПРОТИВ:

int x;

public    string y;
protected float  z;

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

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

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

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

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

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

"The default access modifier is not private but internal"

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

"Private is only the default for methods on a type"

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

"Actually, if the class or struct is not declared with an access modifier it defaults to internal"

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

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

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

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

См. http://csharpindepth.com/viewnote.aspx?noteid=54 для получения более подробной информации.

Разве модификатор по умолчанию для членов структура не был «общедоступным» в какой-то версии .NET? Или меня что-то еще смущает?

Konamiman 10.02.2015 13:12

@Konamiman: Я никогда не вспомнил. Может в пре-релизе?

Jon Skeet 10.02.2015 13:14

Я впервые познакомился с .NET в 2003 году, версия 1.1. Возможно, я случайно прочитал некоторую предварительную документацию.

Konamiman 10.02.2015 13:21

ИМХО Явная форма лучше. Еще одна вещь, которую следует учитывать, - это то, что значения по умолчанию могут измениться со временем. Даже если в данном случае это маловероятно, я лично считаю, что откровенность - лучший подход.

Zohar Peled 22.01.2018 00:05

@Zohar: Я согласен с откровенностью, но думаю, что идея изменения значения по умолчанию со временем нереалистична. С таким же успехом вы можете подумать о том, что значение слова "личное" со временем изменится.

Jon Skeet 22.01.2018 00:25

Что ж, я сказал, что это маловероятно ... Но в случае хорошо развитого языка это, вероятно, преуменьшение. Я почти уверен, что помню, что видел изменения поведения по умолчанию в прошлом, но все это происходило в технологиях, которые были новыми в то время, так что ... Да. Однако этого не произойдет в C#.

Zohar Peled 22.01.2018 00:33

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