W ramach dokumentacji Roslyn w serwisie GitHub znajduje się strona o nazwie Stan implementacji funkcji języka z planowanymi funkcjami językowymi dla C # i VB.
Jedną z funkcji, której nie mogłem ogarnąć głowy, był private protected
modyfikator dostępu:
private protected string GetId() { … }
Istnieje również strona notatek projektowych języka C # , która wyjaśnia wiele nowych funkcji, ale nie tę.
Eric Lippert powiedział w komentarzu :
Twój błąd polega na myśleniu o modyfikatorach jako o rosnących ograniczeniach. W rzeczywistości modyfikatory zawsze zmniejszają ograniczenia. Pamiętaj, że rzeczy są domyślnie „prywatne”; tylko poprzez dodanie modyfikatorów sprawisz, że będą mniej ograniczone.
Jakie to ma znaczenie private protected
? Kiedy mogę tego użyć?
c#
access-modifiers
c#-6.0
c#-7.2
Kobi
źródło
źródło
protected & internal
,assembly protected
lubproternal
(mam nadzieję, że niektóre z nich są żarty). Jest też wątek Dyskusja z ciekawymi spostrzeżeniami.protected | internal
iprotected & internal
Odpowiedzi:
Według „ Professional C # 2008 ” De Billa Evjena i Jaya Glynna, strona 1699:
C ++ / CLI ma podobną funkcję - Definiuj i używaj klas i struktur (C ++ / CLI)> Widoczność elementu członkowskiego :
źródło
internal
typu bez wymagania, aby element członkowski był widoczny dla wszystkiego w zestawie?internal
.internal
widoczność (związana z tym, gdzie zdefiniowano klasę) jest naprawdę ortogonalna dopublic
/protected
/private
widoczność (związana z dziedziczeniem) i być możeinternal
powinna być własnym modyfikatorem niezależnym odpublic
/protected
/private
.package
w Javie bardziej przypomina przestrzeń nazw w C #.Oto wszystkie modyfikatory dostępu na diagramach Venna, od bardziej ograniczających po bardziej rozwiązłe:
private
:private protected
: - dodane w C # 7.2internal
:protected
:protected internal
:public
:źródło
Ma to na celu jedynie przedstawienie wykresu (utworzonego za pomocą http://ashitani.jp/gv/ ) różnych poziomów dostępności (obrazy nie mieszczą się w komentarzach).
Każda strzałka oznacza „jest bardziej restrykcyjna niż”.
Nazwy są CLR
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Znacznie późniejsza edycja: Okazało się, że ten fajny nowy poziom dostępu (o bardzo złej nazwie) nie został ostatecznie uwzględniony w C # 6.0. Jest obsługiwany tylko od wersji C # 7.2 (i widzę, że zaktualizowałeś swoje pytanie „tagi”).
źródło
a → b
na schemacie oznacza „a
jest bardziej restrykcyjny niżb
”, więc możesz „czytać” strzałkę jako „jest bardziej restrykcyjny niż„ (to właśnie próbowałem wyjaśnić), więc strzałka wskazuje w najmniejszym stopniu ” kierunek". Nawiasem mówiąc, przeciwna konwencja dla strzał mogła być równie dobra, ale musiałem wybrać jedną konwencję.To tylko przypuszczenie, ale z nazwy można się domyślić, że jest to bardziej ograniczona wersja
protected
(lub bardziej zrelaksowana wersja,private
jeśli chcesz). Jedynym rozsądnym wariantem jest ograniczenieprotected
zachowania do montażu.Możliwe użycie: wtedy chcesz mieć
protected
do implementacji wewnętrznej, ale nie do użytku zewnętrznego (i nie chcesz zapieczętować klasy).PS Zawsze istniał w środowisku CLR, ale nie w C # . To połączenie
protected
iinternal
, cytuj:źródło
„Może być” widoczne tylko dla podklas, które są w tym samym zestawie. To sprawia, że jest trochę ograniczony niż
protected
.źródło
Zobacz specyfikację funkcji „private protected”:
źródło