В чем разница между публичным, частным, защищенным и не имеющим модификатора доступа?

Все мои годы колледжа я пользовался public и хотел бы знать разницу между public , private и protected ?

И что делает static , а не ничего?

Модификаторы доступа

общественности

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

частный

Доступ к типу или члену может получить только код в том же classе или структуре.

защищенный

Доступ к типу или члену может получить только код в том же classе или структуре или в производном classе.

внутренний

Доступ к типу или члену возможен с помощью любого кода в той же сборке, но не с другой сборки.

защищенный внутренний

Доступ к типу или члену может получить любой код в той же сборке или любой производный class в другой сборке.

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

статический

Статический модификатор в classе означает, что class не может быть создан, и что все его члены статичны. Статический член имеет одну версию независимо от того, сколько экземпляров его закрывающего типа создаются.

Статический class в основном такой же, как и нестатический class, но есть одно отличие: статический class не может быть создан извне. Другими словами, вы не можете использовать новое ключевое слово для создания переменной типа classа. Поскольку нет переменной экземпляра, вы получаете доступ к членам статического classа, используя само имя classа.

Однако существует такая вещь, как статический конструктор . Любой class может иметь один из них, включая статические classы. Они не могут быть вызваны напрямую и не могут иметь параметры (кроме параметров любого типа для самого classа). Статический конструктор вызывается автоматически для инициализации classа до создания первого экземпляра или ссылки на любые статические члены. Выглядит так:

 static class Foo() { static Foo() { Bar = "fubar"; } public static string Bar { get; set; } } 

Статические classы часто используются в качестве сервисов, вы можете использовать их так:

 MyStaticClass.ServiceMethod(...); 

Публикация. Если вы видите class, то вы можете увидеть метод

Частный. Если вы являетесь частью classа, вы можете увидеть метод, иначе нет.

Защищенный – тот же, что и Private, плюс все потомки также могут видеть этот метод.

Статический (class) – Помните о различии между «Классом» и «Объектом»? Забудьте все это. Они одинаковы с «статическими» … class является единственным и единственным экземпляром самого себя.

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

Графический обзор (резюме в двух словах)

видимость

Для значений по умолчанию, если вы не добавили модификатор доступа спереди, см. Здесь:
Видимость по умолчанию для classов и членов 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 

Что касается вопроса Ничего

  • Типы пространства имен по умолчанию
  • Любой член типа, включая вложенные типы, является закрытым по умолчанию

введите описание изображения здесь

 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(); } } } 

Хм.

См. Здесь: Модификаторы доступа .

В двух словах:

Публикация дает метод или тип полной видимости из других типов / classов.

Частный позволяет только тип, содержащий приватный метод / переменную, доступ к частному методу / переменной (обратите внимание, что вложенные classы также имеют доступ к содержащимся classам private methods / variables).

Защищенный похож на частный, кроме производных classов, также можно получить доступ к защищенным методам.

«Nothing» – эквивалент VB.NET null. Хотя, если вы имеете в виду «ничего», что означает «нет модификатора доступа», это зависит от него, хотя очень грубое эмпирическое правило (конечно, на C #) заключается в том, что если вы явно не указали модификатор доступа, метод / переменная объявление обычно ограничено, как может быть. т.е.

 public class MyClass { string s = ""; } 

фактически совпадает с:

 public class MyClass { private string s = ""; } 

Связанная статья MSDN предложит полное описание, если явно не указан модификатор доступа.

public – может быть доступ кем угодно.
private – может быть доступен только из classа, в который он входит.
protected – может быть доступен только из classа или любого объекта, который наследует class.

Ничто не похоже на нуль, но на VB.
Static означает, что у вас есть один экземпляр этого объекта, метод для каждого экземпляра этого classа.

Переустановка удивительных диаграмм из этого ответа .

Здесь все модификаторы доступа на диаграммах Венна, от более ограничивающих до более беспорядочных:

private :
введите описание изображения здесь

private protected : – добавлен в C # 7.2
введите описание изображения здесь

internal :
введите описание изображения здесь

protected :
введите описание изображения здесь

protected internal :
введите описание изображения здесь

public :
введите описание изображения здесь

ммм …

Static означает, что вы можете получить доступ к этой функции, не имея экземпляра classа.

Вы можете получить доступ непосредственно из определения classа.

Статус Private указывает, что доступ к переменным может получить только объект одного classа. Защищенный статус расширяет этот доступ для включения потомков этого classа.

«из приведенной выше таблицы мы можем видеть уважение между частным и защищенным … я думаю, что оба одинаковы …. так что нужна эта две отдельные команды»

Проверьте ссылку MSDN для получения дополнительной информации.

Эти модификаторы доступа указывают, где ваши члены видны. Вы, наверное, должны это прочитать. Возьмите ссылку, данную IainMH в качестве отправной точки.

Статические члены – по одному для каждого classа, а не по одному экземпляру.

Тщательно следите за доступностью ваших занятий. Публичные и защищенные classы и методы по умолчанию доступны для всех.

Также Microsoft не очень разбирается в показе модификаторов доступа (общедоступных, защищенных и т. Д.), Когда создаются новые classы в Visual Studio. Поэтому будьте внимательны и подумайте о своей доступности для своего classа, потому что это дверь для вашей внутренней реализации.

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

C # имеет в общей сложности 6 модификаторов доступа:

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

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

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

internal protected : член, объявленный с этой доступностью, может быть виден внутри типов, полученных из содержащего типа внутри или снаружи содержащей сборки, он также видим для любых типов внутри содержащей сборки. т.е. доступ ограничивается содержащими сборочные или производные типы.

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

C # 7.2 добавляет новый уровень доступности:

private protected : член, объявленный с этой доступностью, может быть виден внутри типов, полученных из этого содержащего типа внутри содержащей сборки. Он не виден ни одному типу, не полученному из содержащего типа или вне содержащейся сборки. т.е. доступ ограничен производными типами внутри содержащей сборки.

Источник, включающий пример кода нового модификатора закрытого защищенного доступа

Interesting Posts

Запись в реальном времени на диск

Проблемы с кодировкой символов Visual Studio C ++

Какой инструмент я могу использовать для копирования DVD-фильмов?

Почему некоторые процессы Windows продолжают записываться на диск даже на системном простоя?

Веб-сайт PrimeFaces CSS не отображается на странице входа, а также JavaScript undefined errors

Случайные триггеры активации Windows INSERT; Как остановить его навсегда?

Переключение alt и lwindows на ПК (Windows 7)

Кэширование в современных браузерах отстой, почему и как исправить?

CSS @media печатает проблемы с фоновым цветом;

Различные легенды и цвета заливки для граненых ggplot?

Наследование наследования проекта Maven – нужно ли указывать родительскую версию?

Почему gulp.src не нравится передавать массив полных путей к файлам?

получить косинус сходство между двумя документами в lucene

Как ffmpeg определяет отдельные битрейты потока?

Отключить плагин Java в Google Chrome?

Давайте будем гением компьютера.