Відповіді:
Від docs.microsoft.com :
Тип або член може отримати доступ будь-яким іншим кодом у тій же збірці або іншій збірці, на яку посилається.
Тип або член можуть отримати доступ лише за кодом у тому ж класі або структурі.
Доступ до типу або члена можна отримати лише за допомогою коду того ж класу або структури, або у похідному класі.
private protected
(додано в C # 7.2)Доступ до типу або члена можна отримати лише за допомогою коду того ж класу або структури, або у похідному класі з тієї ж збірки, але не з іншої збірки.
Тип або член може отримати доступ будь-яким кодом у тій же збірці, але не з іншої збірки.
Тип або член можна отримати за допомогою будь-якого коду в одній збірці або будь-якого похідного класу в іншій збірці.
Якщо не встановлено модифікатор доступу, використовується модифікатор доступу за замовчуванням. Отже, завжди існує певна форма модифікатора доступу, навіть якщо вона не встановлена.
static
модифікаторСтатичний модифікатор класу означає, що клас не може бути екземпляром і всі його члени статичні. Статичний член має одну версію, незалежно від того, скільки створено екземплярів цього типу.
Статичний клас в основному такий же, як нестатичний клас, але є одна відмінність: статичний клас не може бути зовнішньо інстанційним. Іншими словами, ви не можете використовувати нове ключове слово для створення змінної типу класу. Оскільки змінної примірника немає, ви отримуєте доступ до членів статичного класу, використовуючи саме ім’я класу.
Однак є така річ, як статичний конструктор . Будь-який клас може мати один із них, включаючи статичні класи. Вони не можуть бути викликані безпосередньо і не можуть мати параметри (крім будь-яких параметрів типу у самому класі). Статичний конструктор викликається автоматично для ініціалізації класу до створення першого екземпляра або посилання будь-яких статичних членів. Виглядає так:
static class Foo()
{
static Foo()
{
Bar = "fubar";
}
public static string Bar { get; set; }
}
Статичні класи часто використовуються як сервіси, ви можете їх використовувати так:
MyStaticClass.ServiceMethod(...);
Графічний огляд (короткий виклад)
Оскільки статичні класи запечатані, вони не можуть бути успадковані (за винятком Object), тому захищене ключове слово недійсне для статичних класів.
Якщо типово не встановити модифікатор доступу спереду, дивіться тут:
видимість за замовчуванням для класів та членів C # (поля, методи тощо)?
Не вкладений
enum public
non-nested classes / structs internal
interfaces internal
delegates in namespace internal
class/struct member(s) private
delegates nested in class/struct private
Вкладено:
nested enum public
nested interface public
nested class private
nested struct private
Крім того, є вони запечатані-ключове слово, що робить клас не успадкованим.
Також у VB.NET ключові слова часом бувають різними, тому тут шпаргалка:
Загальнодоступний - якщо ви можете бачити клас, то ви можете бачити метод
Приватне - Якщо ви є частиною класу, ви можете бачити метод, інакше ні.
Захищений - такий самий, як приватний, плюс цей метод також можуть бачити всі нащадки .
Статичний (клас) - Пам’ятаєте різницю між «Класом» та «Об’єктом»? Забудьте про все це. Вони однакові з "статичними" ... клас - це єдиний екземпляр сам по собі.
Статичний (метод) - кожного разу, коли ви використовуєте цей метод, він матиме систему відліку, незалежну від фактичного примірника класу, до якого він входить.
Повторне розміщення дивовижних діаграм із цієї відповіді .
Ось всі модифікатори доступу в діаграмах Венна, від більш обмежувальних до більш розбещених:
private
:
private protected
: - додано в C # 7.2
internal
:
protected
:
protected internal
:
public
:
using System;
namespace ClassLibrary1
{
public class SameAssemblyBaseClass
{
public string publicVariable = "public";
protected string protectedVariable = "protected";
protected internal string protected_InternalVariable = "protected internal";
internal string internalVariable = "internal";
private string privateVariable = "private";
public void test()
{
// OK
Console.WriteLine(privateVariable);
// OK
Console.WriteLine(publicVariable);
// OK
Console.WriteLine(protectedVariable);
// OK
Console.WriteLine(internalVariable);
// OK
Console.WriteLine(protected_InternalVariable);
}
}
public class SameAssemblyDerivedClass : SameAssemblyBaseClass
{
public void test()
{
SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(privateVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
public class SameAssemblyDifferentClass
{
public SameAssemblyDifferentClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.internalVariable);
// NOT OK
// Console.WriteLine(privateVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
//Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
}
using System;
using ClassLibrary1;
namespace ConsoleApplication4
{
class DifferentAssemblyClass
{
public DifferentAssemblyClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
// Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protectedVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protected_InternalVariable);
}
}
class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
{
static void Main(string[] args)
{
DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
//Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
dd.test();
}
}
}
Private Protected
, це було б: той самий клас = Yes
, однакова збірка, похідний клас = Yes
, однакова збірка, будь-який клас = NO
, інша збірка, похідний клас = NO
, інша збірка, будь-який клас = NO
. Ще однією пропозицією було б не перемикати порядок слів protected internal
, оскільки це порушує пневмоніку з відповіді @ user1810087
Ще один візуальний підхід поточного модифікатора доступу (C # 7.2). Сподіваємось, схема допомагає запам'ятати її легше
(натисніть на зображення для інтерактивного перегляду.)
Якщо ви намагаєтеся запам’ятати двоскладні модифікатори доступу, пам’ятайте про зовні .
Хм.
Дивіться тут: Модифікатори доступу .
Коротко:
Public надає методу чи типу повну видимість з інших типів / класів.
Приватний дозволяє тільки тип, що містить приватний метод / змінну, доступ до приватного методу / змінної (зауважте, що вкладені класи також мають доступ до приватних методів / змінних, що містять класи).
Захищений схожий на приватний, окрім похідних класів, також можна отримати доступ до захищених методів.
"Нічого" - еквівалент VB.NET нулю. Хоча якщо ви маєте на увазі "нічого", що означає "немає модифікатора доступу", це залежить, хоча дуже грубе правило (безумовно, в C #) полягає в тому, що якщо ви чітко не вказуєте модифікатор доступу, метод / змінну декларація зазвичай настільки ж обмежена, наскільки це може бути. тобто
public class MyClass
{
string s = "";
}
фактично те саме, що:
public class MyClass
{
private string s = "";
}
Зв'язана стаття MSDN надасть повний опис, коли не існує чітко вказаного модифікатора доступу.
публічний - до нього може бути доступ будь-хто.
приватний - доступ до нього можна отримати лише з класу, до якого він входить.
захищений - доступ до нього може бути доступний лише з класу або будь-якого об'єкта, який успадковує клас.
Ніщо не нагадує нуля, але в VB.
Статичний означає, що у вас є один екземпляр цього об'єкта, метод для кожного примірника цього класу.
Статус Приватний вказує на те, що до змінних можуть бути доступні лише об'єкти одного класу. Захищений статус поширює цей доступ і на нащадків класу.
"З наведеної вище таблиці ми можемо побачити відмінність між приватними та захищеними ... я думаю, що обидва однакові .... так, у чому потреба в цих двох окремих командах"
Перевірте посилання MSDN для отримання додаткової інформації
Ці модифікатори доступу вказують, де бачать ваші члени. Ви, напевно, повинні прочитати це. Візьміть посилання, подане IainMH, як вихідну точку.
Статичні члени - один на клас, а не один на примірник.
Уважно стежте за доступністю своїх занять. Публічні та захищені класи та методи за замовчуванням доступні для всіх.
Крім того, Microsoft не дуже чітко показує модифікатори доступу (загальнодоступні, захищені тощо), коли створюються нові класи в Visual Studio. Отже, будьте добре уважні та подумайте про доступність свого класу, оскільки це двері до внутрішніх справ вашого впровадження.
Я думаю, що це пов'язано з хорошим дизайном OOP. Якщо ви розробник бібліотеки, ви хочете приховати внутрішню роботу своєї бібліотеки. Таким чином, згодом ви можете змінити внутрішню роботу бібліотеки. Таким чином, ви ставите своїх членів та помічників як приватні, а лише методи інтерфейсу є загальнодоступними. Методи, які слід перезаписати, слід захищати.
C # має загалом 6 модифікаторів доступу:
приватний : Член, оголошений з цією доступністю, може бути видимим у складі містить тип, він не видно жодним похідним типам, іншим типам у тій же збірці або типам, що не містять збірки, що містить. тобто доступ обмежений лише типом, що містить тип.
захищено : учасник, оголошений з цією доступністю, може бути видимим у межах типів, що походять від утримуючого типу, у складі, що містить, і типів, похідних від типу, що містить, поза вмістуючої збірки. тобто доступ обмежений похідними типами, що містять тип.
Внутрішній : Член, оголошений з цією доступністю, може бути видимим у складі, що містить цього члена, він не видно жодному зібранню за межами містить збірку. тобто доступ обмежений лише тим, що містить збірку.
Внутрішньо захищений : учасник, оголошений з цією доступністю, може бути видимим у межах типів, що походять від типу, що міститься, всередині або поза ним, він містить також будь-які типи, що містять збірку. тобто доступ обмежений типом, що містить збірки або похідні типи.
public : Член, оголошений з цією доступністю, може бути видимим у складі, що містить цього члена, або будь-якій іншій збірці, на яку посилається, що містить збірку. тобто доступ не обмежений.
C # 7.2 додає новий рівень доступності:
приватний захищений : учасник, оголошений з цією доступністю, може бути видимим у межах типів, похідних від цього типу, що міститься в складі, що містить. Він не видно для будь-яких типів, що не походять із вмісту, що міститься, або поза його вмістом. тобто доступ обмежений похідними типами всередині містить збірку.
Джерело, включаючи зразок коду нового приватного захищеного модифікатора доступу