В чем смысл запланированного модификатора доступа к закрытой защите?

В рамках документации Roslyn на GitHub есть страница с названием « Статус реализации функции языка» с плановыми языковыми функциями для C # и VB.

Одна особенность, с которой я не мог обернуть голову, – это модификатор private protected доступа:

 private protected string GetId() { … } 

Существует также страница C # Language Design Notes , в которой объясняются многие новые функции, но не эта.

Эрик Липперт сказал в комментарии :

Ваша ошибка заключается в том, чтобы рассматривать модификаторы как возрастающие ограничения. Модификаторы на самом деле всегда уменьшают ограничения. Помните, что все по-умолчанию «закрыто»; только добавляя модификаторы, вы делаете их менее ограниченными.

В чем смысл private protected ? Когда я могу его использовать?

В соответствии с « Профессиональным C # 2008 » Де Билл Эвжен и Джей Глинн, страница 1699:

private protected – «только производные типы в текущей сборке»

C ++ / CLI имеет аналогичную функцию – определение и использование classов и структур (C ++ / CLI)> Доступность элементов:

private protected protected private – Участник защищен внутри сборки, но закрыт вне сборки.

Здесь все модификаторы доступа на диаграммах Венна, от более ограничивающих до более беспорядочных:

private :
введите описание изображения здесь

private protected : – добавлен в C # 7.2
введите описание изображения здесь

internal :
введите описание изображения здесь

protected :
введите описание изображения здесь

protected internal :
введите описание изображения здесь

public :
введите описание изображения здесь

Это просто для того, чтобы предоставить график (сделанный с помощью http://ashitani.jp/gv/ ) различных уровней доступности (изображения не соответствуют комментариям).

диаграмма уровня доступа C #

Каждая стрелка означает «более ограничительная, чем».

Названия CLR являются Private , FamilyANDAssembly , Assembly , Family , FamilyORAssembly , Public .


Много позже редактирование: оказалось, что этот хороший новый уровень доступа (с действительно бедным именем) в конечном итоге не был включен в C # 6.0. Он поддерживается только с C # 7.2 (и я вижу, что вы обновили tags вопроса “).

Это просто догадка, но от имени вы могли бы догадаться, что это более ограниченная версия protected (или более расслабленной версии private если хотите). И только разумный вариант – это ограничение protected поведения для сборки.

Возможное использование: тогда вы хотите protected внутреннюю реализацию, но не для внешнего использования (и вы не хотите, чтобы уплотнение classа).

PS Он всегда существовал в CLR, но не в C # . Это комбинация protected и internal , цитата:

CLR также поддерживает тип доступа «Семья и assembly». Это означает, что метод доступен из типов объявлений, вложенных и производных, но только если они объявлены в одной и той же сборке. Ну, очевидно, команда C # не думала об этом как о очень полезной функции, поэтому на этом языке она не поддерживается.

«Может быть» видны только для подclassов, которые находятся в одной и той же сборке. Это делает его немного ограниченным, чем protected .

См. Спецификацию для функции «private protected»:

Интуитивное значение частной защиты «доступно в этой сборке по типам, производным от содержащего classа».

Давайте будем гением компьютера.