В чем разница между «защищенными» и «защищенными внутренними»?

Может кто-то, пожалуйста, уточните мне разницу между защищенными и защищенными внутренними модификаторами в C #? Похоже, они ведут себя одинаково.

Модификатор «защищенного внутреннего» доступа является объединением «защищенных» и «внутренних» модификаторов.

Из MSDN, модификаторы доступа (Руководство по программированию на C #) :

защищенный :

Доступ к типу или члену возможен только с помощью кода в том же classе или структуре или в classе, который получен из этого classа.

внутренний :

Доступ к типу или члену возможен с помощью любого кода в той же сборке, но не с другой сборки.

защищенный внутренний :

Доступ к типу или члену может получить любой код в сборке, в котором он объявлен, ИЛИ из производного classа в другой сборке. Доступ из другой сборки должен происходить в объявлении classа, которое происходит от classа, в котором объявлен защищенный внутренний элемент, и он должен проходить через экземпляр типа производного classа.

Обратите внимание : protected internal средства « protected ИЛИ internal » (любой class в той же сборке или любой производный class, даже если он находится в другой сборке).

… и для полноты:

частный :

Доступ к типу или члену возможен только с помощью кода в том же classе или структуре.

общественность :

Доступ к типу или члену может получить любой другой код в той же сборке или другой сборке, которая ссылается на него.

частный защищенный :

Доступ ограничен содержащим classом или типами, производными от содержащего classа в текущей сборке.
( Доступно с C # 7.2 )

protected может использоваться любыми подclassами из любой сборки.

protected internal – это все, что protected , а также что-либо в одной и той же сборке может получить к нему доступ.

Важно отметить, что это не означает «подclassы в одной сборке» – это объединение двух, а не пересечения.

На практике, о методах:

protected – ansible для унаследованных classов, в противном случае частный.

internal – public только для classов внутри сборки, в противном случае частный.

защищенные внутренние средства – защищенные или внутренние – становятся доступными для унаследованных classов и для любых classов внутри сборки.

protected : переменная или метод будут доступны только для дочерних classов (в любой сборке)

protected internal : доступно для дочерних classов в любой сборке и для всех classов внутри одной и той же сборки

По-прежнему существует большая путаница в понимании объема «защищенных внутренних» аксессуаров, хотя в большинстве случаев определение определяется правильно. Это помогло мне понять путаницу между «защищенными» и «защищенными внутренними»:

общественность действительно публична внутри и вне собрания ( общественный внутренний / открытый внешний )

защищенный действительно защищен внутри и снаружи сборки ( защищенный внутренний / защищенный внешний ) (не допускается на classах верхнего уровня)

частное действительно личное внутри и снаружи сборки ( частный внутренний / закрытый внешний ) (не допускается на classах высшего уровня)

внутреннее действительно публично внутри сборки, но исключено вне сборки, как частный ( открытый внутренний / исключенный внешний )

защищенная внутренняя часть действительно общедоступна внутри сборки, но защищена вне сборки ( общедоступная внутренняя / защищенная внешняя ) (не допускается на classах верхнего уровня)

Как вы видите, защищенный внутренний – очень странный зверь. Не интуитивно.

Теперь возникает вопрос, почему Microsoft не создала ( защищенный внутренний / исключенный внешний ), или я предполагаю какой-то «закрытый защищенный» или «внутренний защищенный»? лол. Кажется неполным?

К путанице добавляется тот факт, что вы можете встраивать внутренние или защищенные внутренние вложенные элементы внутри защищенных, внутренних или частных типов. Зачем вам доступ к вложенному «защищенному внутреннему» внутри внутреннего classа, который исключает доступ к внешней сборке?

Microsoft говорит, что такие вложенные типы ограничены областью их родительского типа, но это не то, что говорит компилятор. Вы можете скомпилировать защищенные внутренние элементы внутри внутренних classов, которые должны ограничивать область только сборки.

Для меня это похоже на неполный дизайн. Они должны иметь упрощенную сферу охвата всех типов для системы, которая четко рассматривает наследование, а также безопасность и иерархию вложенных типов. Это сделало бы совместное использование объектов чрезвычайно интуитивным и гранулированным, а не обнаружением доступности типов и элементов на основе неполной системы обзора.

Я зачитал очень четкие определения этих терминов.

Protected: доступ ограничен в пределах определения classа и любого classа, который наследуется от classа. Доступ к типу или члену возможен только с помощью кода в том же classе или структуре или в classе, который получен из этого classа.

Внутренний: доступ ограничен исключительно classами, определенными в текущей сборке проекта. Доступ к типу или члену возможен только по коду в том же classе.

Protected-Internal: доступ ограничен текущей сборкой или типами, полученными из classа.

Защищенный член

Защищенный член classа, ansible только в содержащемся classе (в котором он был объявлен), и в производном classе внутри сборки, а также вне сборки.

Если class, который находится за пределами сборки, может использовать защищенный член другой сборки, унаследованный только этим classом.

Мы можем открыть Защищенный элемент вне сборки, унаследовав этот class и использовать его только в производном classе.

Примечание. Защищенные члены недоступны с использованием объекта в производном classе.

Внутренний член

Внутренний член classа доступен или доступен в сборке либо для создания объекта, либо в производном classе, либо вы можете сказать, что он доступен для всех classов в сборке.

Примечание. Внутренние элементы недоступны вне сборки либо с использованием создания объекта, либо в производном classе.

Защищенный внутренний

Защищенный модификатор внутреннего доступа – это комбинация Protected или Internal.

Защищенный внутренний член может быть доступен во всей сборке, в которой он объявлял либо создавая объект, либо наследуя этот class. И может быть доступен вне сборки только в производном classе.

Примечание. Защищенный внутренний член работает как внутренний внутри той же сборки и работает как защищенный для вне сборки.

public – члены (функции и переменные), объявленные как общедоступные, могут быть доступны из любого места.

private – Частные члены не могут быть доступны извне classа. Это спецификатор доступа по умолчанию для члена, т. Е. Если вы не укажете спецификатор доступа для члена (переменной или функции), он будет считаться закрытым. Поэтому строка PhoneNumber; эквивалентно частной строке PhoneNumber.

protected – Защищенные члены могут быть доступны только из дочерних classов.

internal – Доступ к нему возможен только в пределах одной сборки.

protected internal – Доступ к нему можно получить в рамках одной и той же сборки, а также в производном classе.

Вы можете найти разницу в доступной табличной доступности – да,

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

Защищенные внутренние лучшие пакеты, когда вы хотите, чтобы член или тип, который использовался в производном classе из другой сборки, одновременно хотели бы потреблять член или вводить родительскую сборку, не получая от classа, в котором он был объявлен. Кроме того, если вы хотите использовать только элемент или тип с выводом из другого classа, в той же сборке вы можете использовать только внутренние.

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