Мне нужно объявить элемент, который является одновременно защищенным И внутренним. Однако, к моему полному недоумению, я только что обнаружил, что «защищенный внутренний» на самом деле означает защищенный ИЛИ внутренний. Есть ли какой-либо модификатор доступа, означающий защищенный И внутренний?
Защищенный внутренний C# означает защищенный *ИЛИ* внутренний. Означает ли какое-либо ключевое слово защищенный * И * внутренний?
Ответы (5)
Хотя CLR поддерживает его, в C# нет способ заставить члена быть защищенным И внутренним.
И C#, и VB.NET объединяют модификаторы доступа, используя союз, а не пересечение.
Для этого есть обходной путь, если он вам абсолютно необходим. Это не чисто, но работает. Вы можете создать вспомогательный класс с внутренним свойством, а затем добавить в свой класс защищенное свойство этого типа внутреннего класса. Внутреннее свойство защищенного свойства будет доступно только в подклассе в владеющей сборке.
Пример следует. Я использовал универсальный вариант на тот случай, если вам может понадобиться несколько защищенных внутренних свойств разных типов. Общий позволит вам использовать один внутренний класс независимо от желаемого типа свойства.
public class AccessHelper<T>
{
internal T Value { get; set; }
}
public class AClass
{
public AClass()
{
InternalProperty.Value = "Can't get or set this unless you're a derived class inside this assembly.";
}
protected AccessHelper<String> InternalProperty
{
get;
set;
}
}
AccessHelper<T>
на класс, который должен подделывать защищенные внутренние члены.)
- person pyon; 08.04.2011
защищенный И внутренний недоступен в С# (или любом другом языке .NET высокого уровня, если не ошибаюсь). Хотя это поддерживается CLR и может быть достигнуто в IL.
Цитата из ссылки Equiso:
Кстати, в CLR есть понятие ProtectedANDInternal, но в C# нет синтаксиса для его указания. Если вы посмотрите на перечисление System.Reflection.MethodAttributes CLR, вы увидите как FamANDAssem, так и FamORAssem («Семейство» — это термин CLR для защищенного C#, а «Assem» — внутренний C#).
Вы не можете определить члены защищенные И внутренние в C#, хотя это поддерживается средой CLR (MemberAttributes.FamilyAndAssembly
)
Как насчет внутреннего класса и защищенного члена.
internal
было бы достаточно, если только по какой-либо причине вы не разрешаете случайным людям добавлять классы в вашу сборку. - person Powerlord   schedule 08.04.2011protected
иinternal
намного полезнее, чемprotected
илиinternal
, которые приятны, но не обязательны. Я очень стараюсь и до сих пор не могу придумать реальный сценарий, в которомprotected
илиinternal
является правильным модификатором доступа. (Но, в любом случае, так уж устроен C#, поэтому я воспользуюсьinternal
и заткнусь. Не потому, что он мне нравится, а потому, что нет ничего лучше.) - person pyon   schedule 08.04.2011