使用访问修饰符 public,protected,internal,private可以为成员指定特定的访问性。
下面这张表格是从MSDN摘录的。
声明的可访问性 | 含义 |
public | 访问不受限制 |
protected | 访问仅限于包含类或从包含类派生的类型 |
internal | 访问仅限于当前程序集 |
protected internal | 访问仅限于从包含类派生的当前程序集或类型 |
private | 访问仅限于包含类型 |
对于protected、internal、protected internal访问修饰符,可能是有较多争论的地方。
protected internal和internal protected具有相同的修饰效果。
1、 protected在MSDN上的解释: 访问仅限于包含类或从包含类派生的类型。用protected修饰的成员限定在包容类内部和从包容类派生的类访问,而不限于本程序集。程序集之间的派生类也可以访问具有protected修饰符的基类成员,但是仅限于派生类。
2、 internal的访问性限制于当前的程序集。
3、 protected internal 组合修饰符在MSDN上的解释: 访问仅限于从包含类派生的当前程序集或类型。protected internal 修饰符是protected和internal的组合,作用范围是取他们的并集而不是交集,下面会有程序来验证。
protected internal和protected的异同:
1、 protected internal和protected修饰的成员都具有跨程序集访问的能力。
2、 在同一程序集中protected修饰的成员只能在包容类和派生的类型内访问,而protected internal则可以在包容类的外部访问成员。
下面用代码来验证上面的叙述,建立两个程序集Assembly1和Assembly2。在Assembly1中有两个类:
BaseClass作为基类出现在程序集中,DerivedClass作为BaseClass的派生类型。我们在DerivedClass的Test()方法中验证BaseClass类成员的可访问性。我们可以看到在同一程序集中通过类继承,用internal,internal protected,protected,public修饰的成员都具有可访问性。
我们再来看看在类外部用(包容类外部)直接用BaseClass类对象访问成员的情况,我们发现无法访问到_protected()这个方法。_protected()方法是用protected修饰的成员。这就说明在同一程序集内,包容类的外部用protected修饰的成员无法访问,而protected internal修饰的成员则可以访问。
在Assembly2程序集中,有一个ThirdClass类。它从程序集Assembly1中的BaseClass类继承而来。
在ThirdClass类的Test()方法中,我们来看看各种修饰符的修饰的成员的可访问性情况。我们看到在跨程序集的派生类型中,用internal protected、protected、public访问修饰符修饰的成员具有可访问性。
这说明使用internal protected、protected、public修饰符修饰的成员具有跨程序集的可访问性。
我们再来看看在跨程序集的非派生类型中,各种修饰符成员的可访问性情况。
可以看到只有public修饰符修饰的成员具有在跨程序集的非派生类中可访问性。
各种修饰符的可访问性排序:
private<internal<protected<internal protected <public。
理由是internal只能在本程序集中访问,而protected、internal protected、public可以跨程序集访问。在同一个程序集中internal protected具有比protected更广泛的访问性(internal protected 可以在包容类外部访问,protected则不可以),public不受任何限制。
如果在成员声明中未指定修饰符,则使用默认的可访问性。不嵌套在其他类型中的顶级类型的可访问性只能是internal或public。这些类型的默认可访问性是internal。嵌套类型(当然也包括方法或属性等)是其他类型的成员,它们可以具有下表(摘自MSDN)所示的声明的可访问性。
属于 | 默认的成员可访问性 | 该成员允许的声明的可访问性 |
enum | public | 无 |
class | private | public protected internal private protected internal |
interface | public | 无 |
struct | private | public internal private |
protected修饰符无法应用于struct,因为struct无法派生或继承。