В чем смысл запланированного модификатора доступа к закрытой защите?
Как часть Roslyn документации по GitHub, есть страница под названием Состояние реализации функции языка, с плановыми языковыми функциями для С# и VB.
Одна особенность, с которой я не мог окутать голову, был private protected
модификатор доступа:
private protected string GetId() { … }
Существует также страница С# Language Design Notes, которая объясняет многие новые функции, но не эту.
Эрик Липперт сказал в comment:
Ваша ошибка заключается в том, чтобы рассматривать модификаторы как возрастающие ограничения. Модификаторы на самом деле всегда уменьшают ограничения. Помните, что по умолчанию это "private"; только добавляя модификаторы, вы делаете их менее ограниченными.
В чем смысл private protected
? Когда я могу использовать его?
Ответы
Ответ 1
В соответствии с " Professional С# 2008" De Bill Evjen и Jay Glynn, страница 1699:
private protected - "только производные типы в текущей сборке"
С++/CLI имеет аналогичную функцию - Определить и использовать классы и структуры (С++/CLI) > Видимость элементов:
private protected
-or- protected private
- Участник защищен внутри сборки, но закрыт вне сборки.
Ответ 2
Здесь все модификаторы доступа на диаграммах Венна, от более ограничивающих до более беспорядочных:
private
:
![enter image description here]()
private protected
: ( * предлагаемая функция - в настоящее время недоступна в С#)
![enter image description here]()
internal
:
![enter image description here]()
protected
:
![enter image description here]()
protected internal
:
![enter image description here]()
public
:
![enter image description here]()
Ответ 3
Это просто для получения графика (сделанного http://ashitani.jp/gv/) различных уровней доступности (изображения не соответствуют комментариям).
![digraph diagram of C# access levels]()
Каждая стрелка означает "более ограничительная, чем".
Имена CLR: Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
.
Ответ 4
Это просто предположение, но из названия вы могли бы угадать более ограниченную версию protected
(или более расслабленной версии private
, если хотите). И только разумный вариант его ограничивает поведение protected
для сборки.
Возможное использование: тогда вы хотите иметь protected
для внутренней реализации, но не для внешнего использования (и вы не хотите уплотнять класс).
P.S. Он всегда существовал в CLR, но не в С#. Это комбинация protected
и internal
, цитата:
CLR также поддерживает тип доступа "Семья и сборка". Это означает, что метод доступен из типов объявлений, вложенных и производных, но только если они объявлены в одной и той же сборке. Ну, очевидно, команда С# не думала об этом как о очень полезной функции, поэтому ее не поддерживали на этом языке.
Ответ 5
"Может быть" видимым только для подклассов, которые находятся в одной сборке. Это делает его немного ограниченным, чем protected
.