Jakie jest znaczenie planowanego modyfikatora" private protected " C# access?
Jako część dokumentacji Roslyn na Githubie, istnieje strona o nazwie Language feature implementation status, z planowanymi funkcjami językowymi dla C# i VB.
Jedną z funkcji, której nie mogłem ogarnąć, byłprivate protected
modyfikator dostępu:
private protected string GetId() { … }
Istnieje również Strona C# Language Design Notes , która wyjaśnia wiele nowych funkcji, ale nie tę.
Eric Lippert powiedział w komentarz :
Twój błąd polega na myśleniu o modyfikatory jako coraz większe ograniczenia. Modyfikatory w rzeczywistości zawsze zmniejszają ograniczenia. Pamiętaj, że rzeczy są domyślnie "prywatne"; tylko poprzez dodanie modyfikatorów można je zmniejszyć.
Jakie jest znaczenie private protected
? Kiedy mogę go użyć?
6 answers
Zgodnie z " Professional C# 2008 " De Bill Evjen i Jay Glynn, strona 1699:
Private protected - "tylko typy pochodne w bieżącym zbiorze"
C++ / CLI ma podobną funkcję- Definiuj i używaj klas i struktur (C++/CLI) > widoczność członków:
private protected
-or -protected private
- członek jest chroniony wewnątrz zgromadzenia, ale prywatny poza zgromadzeniem.
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
2014-04-04 18:52:13
Oto wszystkie modyfikatory dostępu na diagramach Venna, od bardziej ograniczającego do bardziej rozwiązłego:
private
:
private protected
: - dodano w C# 7.2
internal
:
protected
:
protected internal
:
public
:
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
2017-12-18 12:11:35
Jest to tylko po to, aby dostarczyć Wykres (wykonany z 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 CLR to Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
.
Znacznie później edit: okazało się, że ten nowy, ładny poziom dostępu (o naprawdę kiepskiej nazwie) został , a nie W końcu włączony do C# 6.0. Jest wspierany tylko z C# 7.2 (i widzę zaktualizowałeś swoje pytanie "tagi").
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-01-29 14:58:55
To tylko domysł, ale z nazwy można się domyślać, że jest to bardziej ograniczona wersja protected
, (lub bardziej zrelaksowana wersja private
, jeśli chcesz). A jedynym rozsądnym jego wariantem jest ograniczenie protected
zachowania do montażu.
Możliwe użycie: wtedy chcesz mieć protected
do wewnętrznej implementacji, ale nie do zewnętrznych zastosowań (i nie chcesz uszczelniać klasy).
P. S. zawsze istniał w CLR, ale nie w C # . To połączenie protected
oraz internal
, cytat:
CLR obsługuje również typ dostępu "Family and assembly". Oznacza to, że metoda jest dostępna z poziomu deklarującego typu, typów zagnieżdżonych i pochodnych, ale tylko wtedy, gdy są zadeklarowane w tym samym złożeniu. Cóż, najwyraźniej zespół C# nie uważał tego za bardzo przydatną funkcję, więc nie jest obsługiwany w tym języku.
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-07-30 04:09:43
"może być" widoczne tylko dla podklas, które są w tym samym zestawie. To sprawia, że jest nieco ograniczony niż protected
.
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
2014-04-04 07:49:21
Zobacz spec dla funkcji "private protected":
Intuicyjne znaczenie private protected jest "dostępne w tym zestawieniu przez typy wywodzące się z klasy zawierającej".
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
2017-12-28 06:12:43