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