protected
和internal protected
有什么区别呢?protected
和internal protected
有什么区别呢?Internal
表示只能在程序集内部访问。
Protected
表示只有继承自该类的类才能访问,包括在同一程序集内的和不在同一程序集内的。
Protected internal
表示既可以在程序集内部访问,也可以被继承自它所在类的类型访问(包括其他程序集中的类型)。
参见:http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
从页面复制:
public Access is not restricted.
protected Access is limited to the containing class or types derived from the containing class.
internal Access is limited to the current assembly.
protected internal Access is limited to the current assembly or types derived from the containing class.
private Access is limited to the containing type.
protected internal
并且您从另一个程序集中派生了该类,则无法访问该方法等。但是如果只是protected
,则可以访问。 - Lasse Espeholtprotected
表示只有当前类和派生自它的类可以访问该成员。
internal
表示当前程序集中的任何类都可以访问该成员。
protected internal
实际上意味着protected
或者internal
;也就是说,所有派生自当前类(在任何程序集中)的类以及当前程序集中的所有类都可以访问该成员。这与许多开发人员的预期不同--他们认为protected internal
意味着与protected
和internal
相同(但实际上并不是这样)。
internal
- 只能被相同程序集(.dll 或 .exe)中的任何内容看到。protected
- 可以被任何子类看到,无论它们在哪里。internal protected
- 可以被相同程序集中的任何内容和任何子类看到,无论它们在哪里。Jeff Mattfield所说的“internal进一步降低了可见性”的方式使其不清楚。 internal
和 protected
仅仅是不同的可见性。同时使用这两个访问修饰符会使成员变得更加可见。没有明确访问修饰符的默认可见性尽可能小。添加任何访问修饰符都会增加可见性。
internal protected
或 protected internal
是相同的,意思是从外部来看是 protected
(在当前程序集之外),而从内部来看是 public
(在同一程序集内)。
Protected internal和protected访问修饰符与继承的概念有关。
我们通过示例来解释protected和protected internal。
有两个命名空间,分别为命名空间A和命名空间B。
在命名空间A中,有一个名为classA的类,其中包含一个使用protected访问修饰符的方法accept()。
在命名空间B中,有另一个类,名为classB,它从命名空间A的classA继承而来。
现在,借助于这个protected访问修饰符,我们可以在命名空间B的classB中访问那个accept()方法。
但是,当使用protected internal访问修饰符时,这个概念就不正确了: 如果namespace A的classA的accept()函数使用protected internal访问修饰符,那么namespace B的classB将无法访问它,因为该accept()函数只能在相同命名空间内的继承类中访问。 namespace InternalTest ----This namespace in assembly One
{
Public class A
{
B ol=new B();
Console.WriteLine(ol.x);//Output:5
Console.WriteLine(ol.y);//error will occured. Because protected is like Private variable
}
public class B
{
Internal int x=5;
Protected int y=5;
}
}
2) 使用不同的程序集。
using InternalTest;
namespace InternalTest1 ----This namespace in assembly Two
{
Public class A1:B
{
Public void GetInternalValue()
{ return x; //error can't access because this is internal
}
Public void GetProtectedValue()
{
return y;//Work because it's protected
}
}
public class C
{
}
}
从上面的例子清楚地可以看出,在同一程序集中可以访问内部(internal)成员,但在不同的程序集中不能。可以说,在同一程序集中它类似于公共变量。您可以通过创建类的对象来赋值。
3)protected internal 同时具有公共变量的好处。在同一程序集中,它看起来像是公共变量。在不同的程序集中使用时则像是受保护的变量。
internal protected
允许您从未派生自同一对象的类中访问同一程序集中的成员,但也允许您获取访问来自另一个程序集的成员所需的标准受保护访问。它是 internal | protected,而不是 internal & protected(尽管 CLR 允许后者,但 C# 不允许)。
受保护的
如果类被声明为“受保护的”,意味着它可以被子类从程序集内部以及程序集外部访问。
内部的
如果类被声明为“内部的”,意味着它可以被程序集中的任何类访问。
受保护的内部
如果类被声明为“受保护的内部”,意味着它只能被其派生类在程序集内部访问。