В чем смысл планируемого модификатора доступа "private protected" C#?


в рамках Рослин документация на GitHub, есть страница под названием состояние реализации языковой функции, с запланированными языковыми функциями для C# и VB.

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

private protected string GetId() { … } 

есть также страницы Примечания К Дизайну Языка C#, что объясняет многие новые функции,но не этот.

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

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

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

6 130

6 ответов:

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

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

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

private protected или protected private - элемент защищен внутри сборки, но закрыт снаружи собрание.

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

private:
enter image description here

private protected: -добавлено в C# 7.2
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

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

digraph diagram of C# access levels

каждая стрелка означает "является более ограничительным, чем".

имена 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- "доступно в этой сборке по типам, производным от содержащего класса".