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


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

10 198

10 ответов:

модификатор доступа "защищенный внутренний" - это Союз как" защищенных", так и" внутренних " модификаторов.

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

защищенный:

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

внутренние:

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

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

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

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

...и полнота:

частная:

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

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

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

private protected:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

внутренние действительно является публичным внутри сборки, но исключен за пределами сборки, как частный (public internal / excluded external)

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

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

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

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

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

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

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

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

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

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

Защищенный

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

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

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

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

Внутренние

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

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

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

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

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

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

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

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

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

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

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

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

enter image description here

Protected internal best suites когда вы хотите, чтобы член или тип использовался в производном классе из другой сборки, в то же время просто хотите использовать член или тип в родительской сборке, не производя от класса, в котором он объявлен. Кроме того, если вы хотите использовать только член или тип без вывода из другого класса, в той же сборке вы можете использовать только внутренний.