Что означает запланированный "закрытый защищенный" модификатор доступа C#?

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

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

private protected string GetId() { … } 

Существует также страница заметок по дизайну языка C#, на которой объясняется множество новых функций, но не эта.

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

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

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

6 ответов

Решение

Согласно " Professional C# 2008" Де Билла Эвджена и Джея Глинна, стр. 1699:

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

C++ / CLI имеет похожую функцию - определение и использование классов и структур (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 (и я вижу, вы обновили свой вопрос "теги").

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

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

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

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

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

Смотрите спецификацию для "частной защиты":

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

Другие вопросы по тегам