Може хтось, будь ласка, розробив мені різницю між захищеними та захищеними внутрішніми модифікаторами в C #? Схоже, вони поводяться однаково.
Може хтось, будь ласка, розробив мені різницю між захищеними та захищеними внутрішніми модифікаторами в C #? Схоже, вони поводяться однаково.
Відповіді:
"Захищений внутрішній" модифікатор доступу є об'єднанням "захищених" і "внутрішніх" модифікаторів.
З MSDN, Модифікатори доступу (Посібник з програмування C #) :
захищено :
Доступ до типу або члена можна отримати лише за допомогою коду того ж класу або структури, або в класі, який є похідним від цього класу.
Тип або член може отримати доступ будь-яким кодом у тій же збірці, але не з іншої збірки.
захищений внутрішній :
Тип або член можна отримати за допомогою будь-якого коду в складі, в якому він оголошений, АБО з всередині похідного класу в іншому складі. Доступ з іншої збірки повинен мати місце в оголошенні класу, що походить від класу, в якому оголошено захищений внутрішній елемент, і має відбуватися через екземпляр похідного типу класу.
Зауважте, що : protected internal
означає " protected
АБО internal
" (будь-який клас в одній збірці або будь-який похідний клас - навіть якщо він знаходиться в іншій збірці).
... і для повноти:
Доступ до типу або члена можна отримати лише за допомогою коду в одному класі або структурі.
Тип або член може отримати доступ будь-яким іншим кодом у тій же збірці або іншій збірці, на яку посилається.
Доступ обмежений класом, що містить або типом, отриманим із класу, що містить, у межах поточної збірки.
( Доступно з C # 7.2 )
protected
може використовуватися будь-якими підкласами з будь-якої збірки.
protected internal
це все, що protected
є, а також все, що в тій же збірці може отримати доступ до нього.
Важливо, що це не означає "підкласи в одній збірці" - це об'єднання двох, а не перетин.
private protected
модифікатора доступу, який був представлений в C # 7.2
На практиці про методи:
захищені - доступні для успадкованих класів, інакше приватні.
внутрішній - загальнодоступний лише для занять всередині зборів, інакше приватний.
внутрішні захищені - означає захищені чи внутрішні - методи стають доступними для успадкованих класів та для будь-яких класів всередині збірки.
protected
І internal
?
protected internal
.
private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Існує ще багато плутанини в розумінні сфери "захищених внутрішніх" аксесуарів, хоча більшість мають визначення визначено правильно. Це допомогло мені зрозуміти плутанину між "захищеним" та "захищеним внутрішнім":
громадськість є дійсно публічною всередині та поза межами асамблеї ( громадські внутрішні / громадські зовнішні )
захищений дійсно захищений всередині і зовні збірки ( захищений внутрішній / захищений зовнішній ) (заборонено для класів верхнього рівня)
private - це дійсно приватне всередині і поза складом ( приватне внутрішнє / приватне зовнішнє ) (не допускається для класів вищого рівня)
внутрішній дійсно є загальнодоступним всередині зборів, але виключається за межами асамблеї, як приватний ( публічний внутрішній / виключається зовнішній )
захищений внутрішній дійсно є загальнодоступним всередині зборів, але захищений поза межами зборів ( загальнодоступний внутрішній / захищений зовнішній ) (не допускається для класів вищого рівня)
Як ви бачите захищений внутрішній - це дуже дивний звір. Не інтуїтивно зрозумілий.
Тепер це виникає питання, чому Microsoft не створив ( захищений внутрішній / виключений зовнішній ), або я здогадуюсь про якийсь "приватний захищений" або "внутрішній захищений"? Лол. Здається неповним?
До плутанини додається той факт, що ви можете розміщувати публічні чи захищені внутрішні вкладені члени всередині захищених, внутрішніх чи приватних типів. Чому ви звертаєтесь до вкладеного "захищеного внутрішнього" всередині внутрішнього класу, який виключає доступ із зовнішньої збірки?
Microsoft каже, що такі вкладені типи обмежені сферою застосування їх батьківського типу, але це не те, що говорить компілятор. Ви можете компілювати захищені внутрішні внутрішні класи, які повинні обмежувати область лише монтажем.
Мені це здається незавершеним дизайном. Вони повинні спростити сферу застосування всіх типів до системи, яка чітко враховує спадкування, але також безпеку та ієрархію вкладених типів. Це зробило б обмін об'єктами надзвичайно інтуїтивним та детальним, а не відкриттям доступності типів та членів на основі неповної системи визначення.
Я прочитав дуже чіткі визначення для цих термінів.
Захищений: доступ обмежений у межах визначення класу та будь-якого класу, який успадковується від класу. Доступ до типу або члена можна отримати лише за допомогою коду в тому ж класі або структурі або в класі, який є похідним від цього класу.
Внутрішній: Доступ обмежується виключно класами, визначеними в рамках поточної збірки проекту. Доступ до типу чи члена можна отримати лише за допомогою коду одного класу.
Захищений-внутрішній: доступ обмежений поточною збіркою або типами, похідними від класу, що містить.
Захищений член
Захищений член класу, доступний лише у класі, що міститься (у якому він оголошений), і у похідному класі в межах збірки, а також поза збіркою.
Значить, якщо клас, який знаходиться поза збіркою, може використовувати захищений член іншої збірки, успадковуючи лише цей клас.
Ми можемо викрити захищений член поза збіркою, успадкувавши цей клас і використовувати його лише у похідному класі.
Примітка: Захищені члени недоступні за допомогою об'єкта у похідному класі.
Внутрішній член
Внутрішній член класу є доступним або доступним у межах складання або створює об'єкт, або у похідному класі, або ви можете сказати, що він доступний для всіх класів у складі.
Примітка: Внутрішні члени, недоступні поза складанням, ні за допомогою створення об'єкта, ні у похідному класі
Захищений внутрішній
Модифікатор захищеного внутрішнього доступу є комбінацією Захищений або Внутрішній.
Захищений внутрішній член може бути доступний у всій збірці, в якій він оголосив або створюючи об'єкт, або успадкував цей клас. І може бути доступним поза збіркою лише у похідному класі.
Примітка: Захищений внутрішній член працює як Внутрішній в межах однієї збірки і працює як Захищений для зовнішньої збірки.
публічно - до членів (функцій та змінних), оголошених як загальнодоступні, можна отримати доступ з будь-якого місця.
private - приватні члени не можуть бути доступні поза класом. Це специфікатор доступу за замовчуванням для члена, тобто якщо ви не вказали специфікатор доступу для члена (змінної або функції), він буде вважатися приватним. Тому рядок PhoneNumber; еквівалентна приватній рядку PhoneNumber.
захищено - До захищених членів можна отримати доступ лише з дитячих класів.
внутрішній - до нього можна отримати доступ лише в межах однієї збірки.
захищений внутрішній - До нього можна отримати доступ як в одній збірці, так і в похідному класі.
Захищені найкращі внутрішні пакети, коли ви хочете, щоб член або тип використовувався у похідному класі з іншої збірки одночасно, просто хочете споживати член або тип у батьківській збірці, не виходячи з класу, де він оголошений. Крім того, якщо ви хочете використовувати лише член або тип з походженням, що походять з іншого класу, в тій же збірці ви можете використовувати лише внутрішній.
protected internal
щоб він знаходивсяprotected
в поточній асамблеї і повністю був недоступний зовні?