Будь-яка причина писати "приватне" ключове слово в C #?


109

Наскільки я знаю, privateза замовчуванням всюди в C # ( це означає , що , якщо я не пишу public, protected, internalі т.д. , це буде privateза замовчуванням). (Будь ласка, виправте мене, якщо я помиляюся.)

Отже, яка причина писати це ключове слово, або чому воно взагалі існує для членів?

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

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

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

Крім того, є випадок , коли писати «приватний» (один) буде змінювати доступність елемента?


18
IIRC, тип "найвищого рівня", internalоднак буде за замовчуванням.
Джефф Меркадо

4
За замовчуванням все не є приватним, як зазначено, і як загальне правило, краще бути явним.
Джеймс Майкл Майєць


Типовим для всього є "максимально приватне". Очевидно, що вкладений клас не може бути приватним, або нічого не може створити його або використати. Але учасники за замовчуванням приватні, а вкладені класи - за замовчуванням приватні. Все в C # за замовчуванням має найбільш обмежений рівень видимості, який він може мати.
Райан Лунді

Відповіді:


171

AFAIK, приватне - це за замовчуванням скрізь у 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, приватне - за замовчуванням скрізь у C #

Не зовсім - за замовчуванням є "найбільш обмежений доступ, доступний для цієї декларації". Так, наприклад, для типу верхнього рівня за замовчуванням є internal; для вкладеного типу типовим є private.

Отже, в чому причина написання цього ключового слова чи чому воно взагалі існує?

Це робить це явним, що добре з двох причин:

  • Це стає зрозумілішим для тих, хто не знає значень за замовчуванням, відповідно до вашого запитання (особисто мені ніколи не сподобався цей аргумент, але я вважав, що це варто згадати)
  • Створюється враження, що ви навмисно вирішили зробити його приватним, а не просто пішли з налаштуваннями за замовчуванням.

Що стосується вашої останньої частини:

Більше того, чи є випадок, коли написання "приватного" (поодинці) змінить доступність члена?

Так, для того, щоб зробити половину нерухомості більш обмежувальною, ніж інша:

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

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

Раніше я їздив із дефолтами скрізь, де міг, але переконався (частково Еріком Ліппертом), що чітко зрозуміти, що ти задумався над цим і вирішив зробити щось приватне - це гарна ідея.

Особисто я хотів би існував спосіб зробити що запечатаний / розкриті теж для оголошення типу - можливо , навіть не мають значення за замовчуванням. Я підозрюю, що багато розробників (включаючи і мене, якщо я не обережний) залишають заняття незапечатаними лише тому, що це менше зусиль, ніж зробити їх герметичними.


+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 #, тому декілька посібників теж допомагають нам.
Каміло Мартін

3
Ну, звичайно, у VB за замовчуванням це жорстоке. Я думаю, що видимість за замовчуванням є, наприклад, Friendдля членів. C # робить свою видимість за замовчуванням правильним способом: речі встановлюються як мінімум видимості, якщо вони не змінені. З того, що мені вдалося знайти, виявляється те саме, що і для C ++ (крім структур). (Здається, це неправда для F #.)
Райан Лунді,

6
Мені дивно, що так багато людей виступає за те var, що це зменшує візуальне занепокоєння, і все ж стільки людей виступають за безглуздо набирати текст private.
Райан Лунді

2
Я б навіть пішов так далеко, щоб стверджувати, що зорове скупчення гальмує читабельність!
binki

1
upvoted хоча я дійсно вважаю за краще використовувати круглі дужки в разі вашого математичного прикладу.
Марк.2377

7

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

Явне оголошення приватним означає, що ви знаєте, що це приватне. Не просто думайте, що це так, адже наскільки ви знаєте, це за замовчуванням. Це також означає, що хтось інший, хто дивиться на код, знає, що це таке.

Немає "Я думаю, що це є", "Я майже впевнений, що це так" і т. Д. Це просто так . І всі на одній сторінці.

Я не розробник C # . Якби мені довелося працювати з деяким кодом, який не був чітко оголошений приватним , я, мабуть, припустив, що він внутрішній .

Мені не подобається, коли речі неявно встановлюються. Це ніколи не так зрозуміло, як коли вони прямо встановлені.


Звучить розумно, я навіть забуваю основи мов, які колись знав краще.
Каміло Мартін

6

Читання - не всі можуть знати, що приватне поведінка за замовчуванням.

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


5

Читання, демонстрація наміру - дві великі причини, про які я можу подумати.


Домовились. Наприклад, якщо ви працюєте з іншими розробниками над трохи коду, встановлення чогось приватного допомагає вказати на ваш намір. Це також корисно, коли через кілька років ви перейдете назад у свій код, і ваш IDE може сказати вам, які методи повинні бути загальнодоступними для цього класу.
Аарон Ньютон

3

Одна з вагомих причин чітко вказати видимість полягає в тому, що вам не доведеться думати про те, що є типовим для контексту, в якому ви перебуваєте.

Ще одна вагома причина тому, що FxCop каже вам це зробити.


+1, я щойно помітив, що FxCop скаржиться на те, що я видаляю приватний модифікатор зараз, коли я будував із зміною.
Каміло Мартін

2

Дуже багато людей (таких як я!) Регулярно програмують на кількох мовах. Ясність таких речей не дозволяє мені запам’ятовувати всі таємні подробиці всіх мов, якими я програмую.


1
Ну, я б не сказав, що "модифікатор доступу за замовчуванням є private" є прихованою деталлю ... Але я розумію суть. Днями у мене виникли проблеми пригадати, як працювали рамки, якими я користувався минулого тижня ( MEF ).
Каміло Мартін

0

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


4
Ви думаєте про C ++. У C #, навіть у структурах, члени за замовчуванням приватні.

3
За замовчуванням структури не мають загальнодоступного доступу - див.: Msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.