2009-02-25 2 views

ответ

286

Модификатор «защищенного внутреннего» доступа - это союз как «защищенных», так и «внутренних» модификаторов.

От MSDN, Access Modifiers (C# Programming Guide):

protected:

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

internal:

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

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

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

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

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

private:

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

public:

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

private protected:

Доступ ограничен содержащего класса или типов, полученного из содержащего класса в пределах текущего узла.
(Доступно начиная с С # 7.2)

+1

Могу ли я иметь член 'protected internal', так что он' protected' в текущей сборке и полностью недоступен извне? – Shimmy

+5

Это было бы «Защищено», не так ли? –

+2

@Shimmy: вы можете иметь внутренний * класс * с защищенными * методами *. Но тогда весь класс будет недоступен из внешних сборок. – M4N

77

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

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

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

+3

Просто FYI для читателей, которые CLR также поддерживают концепцию пересечения защищенной и внутренней доступности, но C# не поддерживает это. C# поддерживает только объединение двух, как указано в этом сообщении. – RBT

22

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

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

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

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

+1

Я бы использовал ИЛИ, чтобы выразить это, потому что это либо не то, и другое должно быть истинным. –

+0

Я не полностью согласен с частью «для изменения поведения базового класса» в описании «protected». Я бы сказал, что здесь вы используете «виртуальный» (в базовом классе) и «переопределить» (в производном классе). – M4N

+0

Есть ли способ отметить участника как 'protected' AND' internal'? – Shimmy

6

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

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

1

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

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

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

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

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

3

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

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

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

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

1

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

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

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

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

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

Внутреннего член

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

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

Protected Внутренняя

Protected Модификатор Внутренний доступ сочетание Protected или внутреннего.

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

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

5

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

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

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

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

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

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

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

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

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

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

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

+1

private protected теперь добавлено в C# 7.2, который в основном является внутренним и защищенным. –

0

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

Смежные вопросы