protected internal (Referenční dokumentace jazyka C#)
Kombinace protected internal
klíčových slov je modifikátor přístupu člena. Chráněný interní člen je přístupný z aktuálního sestavení nebo z typů odvozených z obsahující třídy. Porovnání protected internal
s ostatními modifikátory přístupu najdete v tématu Úrovně přístupnosti.
Příklad
Chráněný interní člen základní třídy je přístupný z libovolného typu v rámci jeho sestavení. Je také přístupný v odvozené třídě umístěné v jiném sestavení pouze v případě, že přístup probíhá prostřednictvím proměnné odvozeného typu třídy. Představte si například následující segment kódu:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
protected internal int myValue = 0;
}
class TestAccess
{
void Access()
{
var baseObject = new BaseClass();
baseObject.myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
Tento příklad obsahuje dva soubory Assembly1.cs
a Assembly2.cs
.
První soubor obsahuje veřejnou základní třídu BaseClass
a jinou třídu . TestAccess
BaseClass
vlastní chráněný interní člen , myValue
který je přístupný typem TestAccess
.
Ve druhém souboru se pokus o přístup myValue
prostřednictvím instance BaseClass
způsobí chybu, zatímco přístup k tomuto členu prostřednictvím instance odvozené třídy DerivedClass
bude úspěšný.
Členy struktury nemohou být protected internal
, protože strukturu nelze zdědit.
Přepsání chráněných interních členů
Při přepsání virtuálního členu modifikátor přístupnosti přepsáné metody závisí na sestavení, kde je definována odvozená třída.
Pokud je odvozená třída definována ve stejném sestavení jako základní třída, mají všichni protected internal
přepsání členové přístup. Pokud je odvozená třída definována v jiném sestavení než základní třída, mají přepsání členové protected
přístup.
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
protected internal virtual int GetExampleValue()
{
return 5;
}
}
public class DerivedClassSameAssembly : BaseClass
{
// Override to return a different example value, accessibility modifiers remain the same.
protected internal override int GetExampleValue()
{
return 9;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
// Override to return a different example value, since this override
// method is defined in another assembly, the accessibility modifiers
// are only protected, instead of protected internal.
protected override int GetExampleValue()
{
return 2;
}
}
specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.