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ć?

Author: Kobi, 2014-04-04

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.

 95
Author: Gogutz,
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:
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

 171
Author: Kobi,
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).

diagram digrafów poziomów dostępu do C#

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").

 27
Author: Jeppe Stig Nielsen,
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.

 9
Author: Petr Abdulin,
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.

 5
Author: Mehmet Ataş,
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".

 1
Author: Julien Couvreur,
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