What is the difference between the "protected" and "protected internal" modifiers in .NET?
views:
1031answers:
4protected
Members are only visible to inheriting types.
protected internal
Members are only visible to inheriting types and also to all types that are also contained within the same assembly as the declaring type.
Here is a C# example:
class Program
{
static void Main()
{
Foo foo = new Foo();
// Notice I can call this method here because
// the Foo type is within the same assembly
// and the method is marked as "protected internal".
foo.ProtectedInternalMethod();
// The line below does not compile because
// I cannot access a "protected" method.
foo.ProtectedMethod();
}
}
class Foo
{
// This method is only visible to any type
// that inherits from "Foo"
protected void ProtectedMethod() { }
// This method is visible to any type that inherits
// from "Foo" as well as all other types compiled in
// this assembly (notably "Program" above).
protected internal void ProtectedInternalMethod() { }
}
private
Access is only allowed from within a specific type
protected
private access is expanded to include inheriting types
internal
private access is expanded to include other types in the same assembly
And so it follows that:
protected internal
private access is expanded to allow access for types that either inherit from or are in the same assembly as this type, or both.
Basically, think of everything as private
first, and anything else you see as expanding on that.
As usual, from one of Fabulous Eric Lippert's blog posts:
Many people believe that [
protected internal
] means "M is accessible to all derived classes that are in this assembly." It does not. It actually means "M is accessible to all derived classes and to all classes in this assembly". That is, it is the less restrictive combination, not the more restrictive combination.This is counterintuitive to a lot of people. I have been trying to figure out why, and I think I've got it. I think people conceive of
internal
,protected
, andprivate
as restrictions from the "natural" state ofpublic
. With that model,protected internal
means "apply both the protected restriction and the internal restriction".That's the wrong way to think about it. Rather,
internal
,protected
andpublic
are weakenings of the "natural" state ofprivate
.private
is the default in C#; if you want to make something have broader accessibility, you've got to say so. With that model, then it becomes clear thatprotected internal
is a weaker restriction than either alone.