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

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

Ответ 1

"Защищенный внутренний" модификатор доступа представляет собой объединение как "защищенных", так и "внутренних" модификаторов.

От MSDN, модификаторы доступа (руководство по программированию на С#):

protected:

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

внутренний:

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

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

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

Обратите внимание, что: protected internal означает "protected OR internal" (любой класс в той же сборке или любой производный класс - даже если он находится в другой сборке).

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

частный

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

публикация

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

защищенный внутренний: доступен для дочерних классов в любой сборке и для всех классов внутри той же сборки

Ответ 5

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

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

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

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

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

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

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

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

внутренний. Доступ к нему можно получить только внутри той же сборки.

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

Ответ 8

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 9

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