The protected
keyword is a member access modifier.
A protected member is accessible within its class and by derived class instances.
For a comparison of protected
with the other access modifiers, see Accessibility Levels.
A protected member of a base class is accessible in a derived class only if the access occurs through the derived class type. For example, consider the following code segment:
namespace Example1
{
class BaseClass
{
protected int myValue = 123;
}
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed through
// the derived class type, not through the base class type.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
}
The statement baseObject.myValue = 10
generates an error because it accesses the protected member through a base class reference (baseObject
is of type BaseClass
). Protected members can only be accessed through the derived class type or types derived from it.
Unlike private protected
, the protected
access modifier allows access from derived classes in any assembly. Unlike protected internal
, it does not allow access from non-derived classes within the same assembly.
Struct members cannot be protected because the struct cannot be inherited.
Example 2In this example, the class DerivedPoint
is derived from Point
. Therefore, you can access the protected members of the base class directly from the derived class.
namespace Example2
{
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
var dpoint = new DerivedPoint();
// Direct access to protected members.
dpoint.x = 10;
dpoint.y = 15;
Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
}
}
// Output: x = 10, y = 15
}
If you change the access levels of x
and y
to private, the compiler will issue the error messages:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
The following example demonstrates that protected
members are accessible from derived classes even when they're in different assemblies:
// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
public class BaseClass
{
protected int myValue = 0;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
using Assembly1;
class DerivedClass : BaseClass
{
void Access()
{
// OK, because protected members are accessible from
// derived classes in any assembly
myValue = 10;
}
}
}
This cross-assembly accessibility is what distinguishes protected
from private protected
(which restricts access to the same assembly) but is similar to protected internal
(though protected internal
also allows same-assembly access from non-derived classes).
For more information, see Declared accessibility in the C# Language Specification. The language specification is the definitive source for C# syntax and usage.
See alsoRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4