В чем разница между «защищенным» и «защищенным внутренним»? - PullRequest
225 голосов
/ 25 февраля 2009

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

Ответы [ 10 ]

371 голосов
/ 25 февраля 2009

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

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

защищенный :

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

внутренний :

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

внутренняя защита :

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

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

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

частный

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

* общественности 1060 *

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

частная защита :

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

83 голосов
/ 25 февраля 2009

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

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

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

23 голосов
/ 25 февраля 2009

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

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

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

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

15 голосов
/ 09 июля 2018

- Обновление ответа 2019 -

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

enter image description here

9 голосов
/ 24 февраля 2017

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

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

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

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

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

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

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

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

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

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

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

7 голосов
/ 14 июня 2009

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

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

3 голосов
/ 28 сентября 2013

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

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

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

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

1 голос
/ 29 декабря 2015

Защищенный участник

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

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

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

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

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

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

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

Внутренняя защита

Модификатор защищенного внутреннего доступа - комбинация Защищенный или Внутренний.

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

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

1 голос
/ 17 апреля 2012

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

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

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

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

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

0 голосов
/ 02 сентября 2017

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

...