Domyślna widoczność dla klas C # i elementów członkowskich (pól, metod itp.)?

164

Próbuję znaleźć odniesienie do domyślnej widoczności różnych aspektów języka C #. Typy klas, pola, metody, wyliczenia itp.

Czy ktoś może dostarczyć ich listę wraz z ich domyślną widocznością (tj. Bez przedrostka modyfikatora)?

Ryan Peters
źródło
możliwy duplikat domyślnego modyfikatora dostępu w C #
Jeff Sternal
8
Nie uważałbym tego za duplikat ... to pytanie jest konkretne (Jakie jest domyślne ustawienie TEGO?), To jest szerokie (Jakie są WSZYSTKIE wartości domyślne?)
WernerCD WernerCD

Odpowiedzi:

266

Wszystkie poszukiwane informacje można znaleźć tutaj i tutaj (dzięki Reed Copsey ):

Od pierwszego linku:

Klasy i struktury, które są zadeklarowane bezpośrednio w przestrzeni nazw (innymi słowy, które nie są zagnieżdżone w innych klasach lub strukturach) mogą być publiczne lub wewnętrzne. Wewnętrzny jest wartością domyślną, jeśli nie określono modyfikatora dostępu .

...

Poziom dostępu dla członków klas i elementów członkowskich struktur , w tym klas zagnieżdżonych i struktur, jest domyślnie prywatny .

...

interfejsy domyślnie obsługują dostęp wewnętrzny .

...

Delegaci zachowują się jak klasy i struktury. Domyślnie mają dostęp wewnętrzny, gdy są zadeklarowane bezpośrednio w przestrzeni nazw, i dostęp prywatny, gdy są zagnieżdżone .


Z drugiego linku:

Typy najwyższego poziomu , które nie są zagnieżdżone w innych typach, mogą mieć tylko wewnętrzną lub publiczną dostępność. Domyślny dostępność dla tych typów jest wewnętrzne .

A dla typów zagnieżdżonych:

Członkowie domyślnej dostępności członków
---------- ----------------------------
enum public
klasa prywatna
interfejs publiczny
struktura prywatna
Oded
źródło
6
Niezła kompilacja z informacji Reeda, ale zapomniałeś określić, że takie modyfikatory dostępu mają również zastosowanie do metod.
Joel
4
@Joel Co masz na myśli? Wyraźnie stwierdza, że ​​„członkowie”. Członkowie są danymi i zachowaniem, a zatem obejmują metody.
rism
Jeśli spojrzy na to jakikolwiek programista vb.net, vb jest inny. Domyślny zakres dla członków klasy vb to Public. Enumczłonkowie są również Public. Prawdopodobnie mniej mylące jest po prostu użycie jawnego zakresu w twoim przypadku, ponieważ istnieje duże prawdopodobieństwo, że zostanie on przetłumaczony lub odczytany przez programistów C # w pewnym momencie. Niestety generowanie kodu w vb.net nie robi tego za Ciebie.
toddmo
Dodam, że zagnieżdżony interfejs w klasie jest domyślnie prywatny, a nie wewnętrzny.
Frank Bryce
13

Z MSDN:

Typy najwyższego poziomu , które nie są zagnieżdżone w innych typach, mogą mieć tylko internallub publicułatwienia dostępu. Domyślna dostępność dla tych typów to internal.


Typy zagnieżdżone , które są członkami innych typów, mogą mieć zadeklarowane ułatwienia dostępu, jak pokazano w poniższej tabeli.

Domyślna dostępność zagnieżdżonego elementu członkowskiego i dozwolone modyfikatory dostępności

Źródło: Poziomy dostępu (C # odniesienia) (06 grudnia th , 2017)

Nicholas Miller
źródło
9

Domyślnie modyfikatorem dostępu dla klasy jest internal. Oznacza to, że klasa jest dostępna w ramach tego samego zestawu. Ale jeśli chcemy, aby klasa była dostępna z innych zestawów, musi zostać upubliczniona.

mrk
źródło
19
Ta informacja była już obecna w innych odpowiedziach. Na pytanie, szczególnie stare, takie jak to, odpowiadaj tylko wtedy, gdy masz dodatkowe informacje do udzielenia lub uważasz, że inne odpowiedzi są błędne. W każdym razie witaj w Stack Overflow.
Gorpik,
Klasa niekoniecznie musi być upubliczniona, aby była dostępna dla innych zestawów. Można by użyć klasy InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam
0

Domyślnie jest to private. O ile nie są zagnieżdżone, klasy są internal.

Svisstack
źródło
1
czy wyliczenia nie są domyślnie publiczne?
Ryan Peters
4
@Jay: Chyba że są zagnieżdżone. @Ryan: Nie, niezagnieżdżone wyliczenia są domyślnie wewnętrzne.
Jon Skeet
2
@Ryan: Członkowie wyliczenia są domyślnie publiczne, ale samo wyliczenie jest wewnętrzne.
Reed Copsey
@ReedCopsey Ale książka, z której się uczę, wyraźnie to mówi enum members are private by default, so to use them outside the enum we should declare them as public. Czy możesz wyjaśnić, dlaczego książka jest sprzeczna z tym, co mówisz? Dzięki.
Cokolwiek czyta książka @ user5794376 (wyraźnie usunięte konto), powinna otrzymać wszystkie 1-gwiazdkowe recenzje, jeśli to, co mówią w książce, jest prawdą. Wystarczy spojrzeć na Microsoft Docs, aby wiedzieć, że elementy członkowskie wyliczenia są domyślnie publiczne i dlatego powszechną praktyką jest, aby wyliczenia nie były na nich jawne.
Rodney S. Foley