Модификатор protected internal
Два ключевых слова protected internal задают
объединение правил: к члену можно обратиться,
если вы находитесь в той же сборке, что и
базовый тип, или если ваш класс наследует
этот тип (даже в другой сборке). Это логическое
ИЛИ между protected
и internal.
Синтаксис
protected internal тип поле;
protected internal тип Метод() { }
Пример
Давайте прочитаем protected internal поле
в наследнике той же сборки:
using System;
class BaseHub
{
protected internal string token = "abcde";
}
class ChildHub : BaseHub
{
public void Print()
{
Console.WriteLine(token);
}
}
class Program
{
static void Main()
{
new ChildHub().Print();
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте обратимся к protected internal
методу из постороннего класса той же сборки
(без наследования):
using System;
class BaseHub
{
protected internal void Ping()
{
Console.WriteLine("ping");
}
}
class Caller
{
public void Run(BaseHub hub)
{
hub.Ping();
}
}
class Program
{
static void Main()
{
new Caller().Run(new BaseHub());
}
}
Результат выполнения кода:
"ping"
Пример
Класс в другой сборке, который не наследует
базовый тип, не увидит protected internal
член - фрагмент не компилируется:
// Сборка A:
class BaseHub
{
protected internal void Ping() { }
}
// Сборка B (ссылка на A), без наследования:
class Remote
{
static void Main()
{
new BaseHub().Ping();
}
}
Доступ остаётся только у наследников или кода сборки A.
Смотрите также
-
модификатор
private protected,
который требует и наследника, и сборку -
модификатор
protected,
который открывает только наследникам -
модификатор
internal,
который открывает только сборке -
модификатор
ref,
который передаёт аргумент по ссылке