W C#, jaka jest różnica między public, private, protected i having no access modifier?

Przez wszystkie lata studiów używałem public i chciałbym poznać różnicę między public, private, i protected?

Również co robi static zamiast mieć nic?

Author: neaumusic, 2009-03-05

16 answers

Modyfikatory dostępu

Z docs.microsoft.com :

public

Do typu lub elementu można uzyskać dostęp za pomocą dowolnego innego kodu w tym samym zestawie lub innym zestawie, który się do niego odwołuje.

private

Do typu lub elementu można uzyskać dostęp tylko za pomocą kodu tej samej klasy lub struktury.

protected

Typ lub element mogą być dostępne tylko za pomocą kodu w tej samej klasie lub struct, lub w klasie pochodnej.

private protected (dodany w C # 7.2)

Typ lub element może być dostępny tylko za pomocą kodu w tej samej klasie lub strukturze, lub w klasie pochodnej z tego samego zestawu, ale nie z innego zestawu.

internal

Do typu lub elementu można uzyskać dostęp za pomocą dowolnego kodu w tym samym zestawie, ale nie z innego zestawu.

protected internal

Typ lub element może być dostęp przez dowolny kod w tym samym złożeniu lub przez dowolną klasę pochodną w innym złożeniu.

Gdy nie jest ustawiony modyfikator dostępu, używany jest domyślny modyfikator dostępu. Więc zawsze istnieje jakaś forma modyfikatora dostępu, nawet jeśli nie jest ustawiony.

static modyfikator

Modyfikator statyczny klasy oznacza, że klasa nie może być utworzona i że wszystkie jej elementy są statyczne. Statyczny członek ma jedną wersję bez względu na to, ile instancji jego tworzone są typy enclosing.

Klasa statyczna jest zasadniczo taka sama jak Klasa niestatyczna, ale jest jedna różnica: Klasa statyczna nie może być utworzona zewnętrznie. Innymi słowy, nie można użyć nowego słowa kluczowego do utworzenia zmiennej typu klasy. Ponieważ nie ma zmiennej instancji, można uzyskać dostęp do członków klasy statycznej, używając samej nazwy klasy.

Istnieje jednak coś takiego jak konstruktor statyczny . Każda klasa może mieć taką, w tym klasy statyczne. Nie mogą być wywoływane bezpośrednio i nie mogą mieć parametrów (innych niż jakiekolwiek parametry typu w samej klasie). Statyczny konstruktor jest wywoływany automatycznie w celu zainicjowania klasy przed utworzeniem pierwszej instancji lub odwołaniem się do statycznych członków. Wygląda tak:

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

Klasy statyczne są często używane jako usługi, możesz z nich korzystać w następujący sposób:

MyStaticClass.ServiceMethod(...);
 1027
Author: mbillard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Graficzny przegląd (podsumowanie w skrócie)

Widoczność

Ponieważ klasy statyczne są zapieczętowane, nie mogą być dziedziczone (z wyjątkiem obiektu), więc słowo kluczowe protected jest nieprawidłowe w klasach statycznych.



Dla domyślnych wartości, jeśli nie umieścisz modyfikatora dostępu z przodu, zobacz tutaj:
domyślna widoczność dla klas i członków C# (pól, metod, itp.)?

Nested

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

Zagnieżdżony:

nested enum      public
nested interface public
nested class     private
nested struct    private

Jest też sealed-słowo kluczowe, które sprawia, że klasa nie jest dziedziczona.
Również w VB.NET, słowa kluczowe są czasami różne, więc tutaj Ściągawka:

Odpowiedniki VB vs CS

 168
Author: Stefan Steiger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-12 11:22:10

Public - Jeśli widzisz klasę, to możesz zobaczyć metodę

Private - Jeśli jesteś częścią klasy, to możesz zobaczyć metodę, w przeciwnym razie nie.

Protected - tak samo jak Private, plus wszystkiepotomkowie mogą również zobaczyć metodę.

Static (class) - pamiętasz rozróżnienie między "Class" I "Object"? Zapomnij o tym. Są takie same z "static"... klasa jest jedyną instancją siebie.

Static (method) - ilekroć użyjesz tej metody, będzie ona miała ramkę odniesienia niezależną od rzeczywistej instancji klasy, której jest częścią.

 161
Author: JosephStyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 17:22:22

Reposting the awesome diagrams from this answer .

Oto wszystkie modyfikatory dostępu na diagramach Venna, od bardziej ograniczającego do bardziej rozwiązłego:

private:
Tutaj wpisz opis obrazka

private protected: - dodano w C# 7.2
Tutaj wpisz opis obrazka

internal:
Tutaj wpisz opis obrazka

protected:
Tutaj wpisz opis obrazka

protected internal:
Tutaj wpisz opis obrazka

public:
Tutaj wpisz opis obrazka

 41
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 08:25:40

Tutaj wpisz opis obrazka

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();
        }
    }
}
 24
Author: Narottam Goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-24 07:24:49

Odnośnie pytania Nic

  • typy przestrzeni nazw są domyślnie wewnętrzne
  • każdy członek typu, w tym zagnieżdżone typy są domyślnie prywatne
 22
Author: leppie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 17:27:55

Yet another visual approach of the current access modifier (C# 7.2). Mam nadzieję, że schemat pomaga zapamiętać go łatwiej
(Kliknij obraz, Aby wyświetlić interaktywny widok.)

interactive access modifiers svg

Na Zewnątrz Wewnątrz

Jeśli masz problemy z zapamiętaniem dwu wyrazowych modyfikatorów dostępu, pamiętaj outside-inside.

  • private protected: prywatne outside (ten sam zespół) protected wewnątrz (ten sam montaż)
  • chronione wewnętrzne: protected zewnętrzne (ten sam zespół) wewnętrzne wewnątrz (ten sam montaż)
 21
Author: user1810087,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-22 07:54:28

Hmm.

Zobacz tutaj: modyfikatory dostępu .

W skrócie:

Public daje metodzie lub typowi pełną widoczność z innych typów / klas.

Private zezwala tylko typowi zawierającemu prywatną metodę/zmienną na dostęp do prywatnej metody / zmiennej (zauważ, że zagnieżdżone klasy mają również dostęp do zawierających ją klas prywatnych metod / zmiennych).

Protected jest podobny do private, z tym że klasy pochodne mogą również uzyskać dostęp do protected metody.

" nic " jest VB.NET jest odpowiednikiem null. Chociaż jeśli mówisz o "nic", co oznacza "brak modyfikatora dostępu", To zależy, chociaż bardzo ogólną zasadą (na pewno w C#) jest to, że jeśli nie określisz bezpośrednio modyfikatora dostępu, deklaracja metody/zmiennej jest zwykle jako restricted, Jak to tylko możliwe. tj.

public class MyClass
{
    string s = "";
}

Jest dokładnie tym samym co:

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

Połączony artykuł MSDN będzie oferował pełny opis, gdy nie ma dostępu modyfikator jawnie określony.

 11
Author: CraigTP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 22:41:39

Public - może być dostępny dla każdego w dowolnym miejscu.
private - można uzyskać dostęp tylko z klasy, której jest częścią.
protected - można uzyskać dostęp tylko z with in klasy lub dowolnego obiektu, który dziedziczy poza klasą.

Nic nie jest jak null tylko w VB.
Statyczny oznacza, że masz jedną instancję tego obiektu, metodę dla każdej instancji tej klasy.

 8
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-17 13:20:46

Mmm...

Statyczne oznacza, że możesz uzyskać dostęp do tej funkcji bez posiadania instancji klasy.

Możesz uzyskać dostęp bezpośrednio z definicji klasy.

 4
Author: gbianchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 13:53:14

Status Private wskazuje, że zmienne mogą być dostępne tylko przez obiekty tej samej klasy. Protected status rozszerza ten dostęp również o Potomków klasy.

" z powyższej tabeli widzimy zależność pomiędzy private I protected... myślę, że oba są takie same.... więc po co te dwa oddzielne polecenia "

Sprawdź MSDN link, aby uzyskać więcej informacji

 4
Author: Grant Hood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-07 17:57:32

Te modyfikatory dostępu określają, gdzie twoi członkowie są widoczni. Powinieneś to przeczytać. Weź link podany przez IainMH jako punkt wyjścia.

Członkowie statyczni to jeden na klasę, A nie jeden na instancję.

 3
Author: jpfollenius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 13:52:47

Ostrożnie! Obserwuj dostępność swoich zajęć. Publiczne i chronione klasy i metody są domyślnie dostępne dla wszystkich.

Ponadto Microsoft nie jest zbyt wyraźny w pokazywaniu modyfikatorów dostępu (publicznych, chronionych itp.. słowa kluczowe) przy tworzeniu nowych klas w Visual Studio. Dbaj więc o dostępność swojej klasy, ponieważ jest to drzwi do wewnętrznych wdrożeń.

 3
Author: Patrick Peters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-18 00:43:43

Myślę, że jest to związane z dobrym projektem OOP. Jeśli jesteś twórcą biblioteki, chcesz ukryć wewnętrzne działanie swojej biblioteki. W ten sposób możesz później zmodyfikować wewnętrzne działanie biblioteki. Więc umieszczasz swoje metody Member i helper jako prywatne, a tylko metody interfejsu są publiczne. Metody, które powinny być nadpisane powinny być chronione.

 2
Author: Darius Kucinskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 19:53:25

C # ma w sumie, 6 modyfikatory dostępu:

Private: Element zadeklarowany z tą dostępnością może być widoczny w typie zawierającym, nie jest widoczny dla żadnych typów pochodnych, innych typów w tym samym złożeniu lub typów poza złożeniem zawierającym. tzn. dostęp jest ograniczony tylko do typu zawierającego.

Protected: Element zadeklarowany z tą dostępnością może być widoczny w typach pochodzących z containing Typ wewnątrz zespołu zawierającego oraz typy pochodzące z typu zawierającego poza zespołem zawierającym. tzn. dostęp jest ograniczony do typów pochodnych typu zawierającego.

Internal: Element zadeklarowany z tą dostępnością może być widoczny w zestawie zawierającym ten element, nie jest widoczny dla żadnego zestawu poza zestawem zawierającym. tzn. dostęp jest ograniczony tylko do złożenia.

Wewnętrzne protected: Element zadeklarowany z tą dostępnością może być widoczny w typach pochodzących z typu zawierającego wewnątrz lub poza złożeniem zawierającym, jest również widoczny dla wszystkich typów w złożeniu zawierającym. tzn. dostęp jest ograniczony do typów składowych lub pochodnych.

Public : członek zadeklarowany z tą dostępnością może być widoczny w Zgromadzeniu zawierającym tego członka, lub w każdym innym zgromadzeniu, które odwołuje się do zawierającego montaż. tj. dostęp nie jest ograniczony.

W C # 7.2 dodano nowy poziom dostępności:

Private protected: Element zadeklarowany z tą dostępnością może być widoczny w typach wywodzących się z tego typu zawierającego w zestawie zawierającym. Nie jest widoczny dla żadnych typów, które nie pochodzą z typu zawierającego lub poza zespołem zawierającym. tj. dostęp jest ograniczony do typów pochodnych w obrębie montaż.

Źródło zawierające przykładowy kod nowego modyfikatora private protected access

 1
Author: Baccata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-18 00:42:31

Wszystkie opisy modyfikatorów dostępu do C #

Tutaj wpisz opis obrazka

 0
Author: snr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-03 19:32:39