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

c# .net access-modifiers

123529 просмотра

10 ответа

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

Автор: Embedd_Khurja Источник Размещён: 17.05.2019 02:42

Ответы (10)


353 плюса

Решение

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

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

защищены :

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

внутренний :

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

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

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

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

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

личное :

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

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

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

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

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

Автор: M4N Размещён: 25.02.2009 12:52

83 плюса

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

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

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

Автор: Marc Gravell Размещён: 25.02.2009 12:53

23 плюса

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

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

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

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

Автор: abatishchev Размещён: 25.02.2009 01:01

9 плюса

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

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

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

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

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

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

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

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

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

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

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

Автор: Stokely Размещён: 24.02.2017 05:47

7 плюса

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

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

Автор: gopi Размещён: 14.06.2009 12:04

6 плюса

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

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

Автор: Andi AR Размещён: 09.07.2018 09:16

3 плюса

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

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

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

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

Автор: Ammar Asjad Размещён: 28.09.2013 01:53

1 плюс

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

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

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

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

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

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

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

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

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

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

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

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

Автор: Mostafa Bouzari Размещён: 29.12.2015 07:50

1 плюс

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

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

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

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

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

Автор: Piush shukla Размещён: 17.04.2012 11:58

0 плюса

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

Автор: satishpkumarin Размещён: 02.09.2017 06:04
Вопросы из категории :
32x32