В чем смысл планируемого модификатора доступа "private protected" C#?
в рамках Рослин документация на GitHub, есть страница под названием состояние реализации языковой функции, с запланированными языковыми функциями для C# и VB.
одна особенность, которую я не мог обернуть вокруг своей головы, была private protected
модификатор доступа:
private protected string GetId() { … }
есть также страницы Примечания К Дизайну Языка C#, что объясняет многие новые функции,но не этот.
Эрик Липперт сказал в a комментарий:
ваша ошибка заключается в том, что модификаторы увеличивают ограничения. Модификаторы на самом деле всегда уменьшают ограничения. Помните, что вещи по умолчанию являются" частными"; только добавляя модификаторы, вы делаете их менее ограниченными.
что означает private protected
? Когда я могу его использовать?
6 ответов:
по данным "Профессиональный C# 2008" де Билл Эвьен и Джей Глинн, страница 1699:
private protected - "только производные типы в текущей сборке"
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
.
гораздо позже edit: оказалось, что этот хороший новый уровень доступа (с очень плохим именем) был не в конце концов входит в C# 6.0. Он поддерживается только с C# 7.2 (и я вижу, что вы обновили свой вопрос "теги").
это просто догадка, но из имени вы могли бы догадаться, что это более ограниченная версия
protected
(или более комфортный вариантprivate
Если вы хотите). И единственный разумный вариант это ограничениеprotected
поведение на собрании.возможное использование: тогда вы хотите иметь
protected
для внутренней реализации, но не для внешнего использования (и вы не хотите запечатывания класс).P. S. Это всегда существовало в CLR, но не в C#. Это сочетание
protected
иinternal
цитирую:CLR также поддерживает тип доступа "Семья и сборка". Это означает, что метод доступен из объявленного типа, вложенных и производных типов, но только если они объявлены в одной сборке. Ну, по-видимому, команда C# не думала об этом как о очень полезной функции, поэтому она не поддерживается на этом языке.
"может быть" виден только для подклассов, которые находятся в одной сборке. Это делает его немного ограниченным, чем
protected
.
посмотреть spec для функции "частная защита":
интуитивное значение private protected- "доступно в этой сборке по типам, производным от содержащего класса".