c# - это - модификаторы доступа ооп




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

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

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

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

частный

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

защищенный

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

частный защищенный (добавлен в C # 7.2)

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

внутренний

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

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

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

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

статический

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

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

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

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

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

MyStaticClass.ServiceMethod(...);

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

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


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

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

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

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

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

private :

private protected : - добавлен в C # 7.2

internal :

protected :

protected internal :

public :


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

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


Хм.

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

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

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

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

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

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

public class MyClass
{
    string s = "";
}

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

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

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


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

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


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


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

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


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

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

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

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

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





access-modifiers