Что означает запланированный "закрытый защищенный" модификатор доступа C#?
Как часть документации Roslyn по GitHub, есть страница, которая называется Статус реализации языковых функций, с запланированными языковыми функциями для C# и VB.
Одна особенность, которую я не мог обернуть вокруг себя, была private protected
модификатор доступа:
private protected string GetId() { … }
Существует также страница заметок по дизайну языка C#, на которой объясняется множество новых функций, но не эта.
Эрик Липперт сказал в комментарии:
Ваша ошибка в том, что вы считаете модификаторы возрастающими ограничениями. Модификаторы на самом деле всегда уменьшают ограничения. Помните, что по умолчанию все "личное"; только добавив модификаторы, вы сделаете их менее ограниченными.
Каково значение private protected
? Когда я могу использовать это?
6 ответов
Согласно " Professional C# 2008" Де Билла Эвджена и Джея Глинна, стр. 1699:
частная защита - "только производные типы в текущей сборке"
C++ / CLI имеет похожую функцию - определение и использование классов и структур (C++/CLI) > Видимость членов:
private protected
-или же-protected private
- Участник защищен внутри сборки, но приватен вне сборки.
Вот все модификаторы доступа на диаграммах Венна, от более ограниченных до более беспорядочных:
private
:
private protected
: - добавлено в C# 7.2
internal
:
protected
:
protected internal
:
public
:
Это просто для того, чтобы предоставить график (созданный с помощью http://ashitani.jp/gv/) различных уровней доступности (изображения не помещаются в комментариях).
Каждая стрелка означает "является более строгим, чем".
Имена CLR Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
,
Гораздо позже редактировать: оказалось, что этот хороший новый уровень доступа (с очень плохим именем) в конечном итоге не был включен в C# 6.0. Это поддерживается только из C# 7.2 (и я вижу, вы обновили свой вопрос "теги").
Это всего лишь предположение, но по названию вы можете догадаться, что это более ограниченная версия protected
, (или более расслабленная версия private
если хочешь). И только разумный вариант этого ограничивает protected
Поведение к сборке.
Возможное использование: тогда вы хотите иметь protected
для внутренней реализации, но не для внешнего использования (и вы не хотите запечатывать класс).
PS Он всегда существовал в CLR, но не в C#. Это сочетание protected
а также internal
, цитата:
CLR также поддерживает тип доступа "Семья и сборка". Это означает, что метод доступен из объявленного типа, вложенного и производного типов, но только если они объявлены в одной сборке. Очевидно, команда C# не думала об этом как о очень полезной функции, поэтому она не поддерживается на этом языке.
"Может быть" видно только подклассам, которые находятся в одной сборке. Это делает его немного ограниченным, чем protected
,
Смотрите спецификацию для "частной защиты":
Интуитивное значение частного защищенного "доступно в этой сборке типами, производными от содержащего класса".