可访问性级别

使用访问修饰符 public,protected,internal,private可以为成员指定特定的访问性。

下面这张表格是从MSDN摘录的。

声明的可访问性

含义

public

访问不受限制

protected

访问仅限于包含类或从包含类派生的类型

internal

访问仅限于当前程序集

protected internal

访问仅限于从包含类派生的当前程序集或类型

private

访问仅限于包含类型

对于publicprivate的使用我们一般都没有多少异议,一般情况下使用public修饰的成员没有任何访问限制,而使用private修饰的成员往往只在包容类的内部使用,包括在内部类(nested class)中也可以使用。

对于protectedinternalprotected internal访问修饰符,可能是有较多争论的地方。

protected internalinternal protected具有相同的修饰效果。

1、  protectedMSDN上的解释: 访问仅限于包含类或从包含类派生的类型。protected修饰的成员限定在包容类内部和从包容类派生的类访问,而不限于本程序集。程序集之间的派生类也可以访问具有protected修饰符的基类成员,但是仅限于派生类。

2、  internal的访问性限制于当前的程序集。

3、  protected internal 组合修饰符在MSDN上的解释: 访问仅限于从包含类派生的当前程序集或类型。protected internal 修饰符是protectedinternal的组合,作用范围是取他们的并集而不是交集,下面会有程序来验证。

protected internalprotected的异同:

1、  protected internalprotected修饰的成员都具有跨程序集访问的能力。

2、  在同一程序集中protected修饰的成员只能在包容类和派生的类型内访问,而protected internal则可以在包容类的外部访问成员。

下面用代码来验证上面的叙述,建立两个程序集Assembly1Assembly2。在Assembly1中有两个类:

BaseClass作为基类出现在程序集中,DerivedClass作为BaseClass的派生类型。我们在DerivedClassTest()方法中验证BaseClass类成员的可访问性。我们可以看到在同一程序集中通过类继承,用internalinternal protectedprotectedpublic修饰的成员都具有可访问性。

我们再来看看在类外部用(包容类外部)直接用BaseClass类对象访问成员的情况,我们发现无法访问到_protected()这个方法。_protected()方法是用protected修饰的成员。这就说明在同一程序集内,包容类的外部用protected修饰的成员无法访问,而protected internal修饰的成员则可以访问。

Assembly2程序集中,有一个ThirdClass类。它从程序集Assembly1中的BaseClass类继承而来。

ThirdClass类的Test()方法中,我们来看看各种修饰符的修饰的成员的可访问性情况。我们看到在跨程序集的派生类型中,用internal protectedprotectedpublic访问修饰符修饰的成员具有可访问性。

这说明使用internal protectedprotectedpublic修饰符修饰的成员具有跨程序集的可访问性。

我们再来看看在跨程序集的非派生类型中,各种修饰符成员的可访问性情况。

可以看到只有public修饰符修饰的成员具有在跨程序集的非派生类中可访问性。

各种修饰符的可访问性排序:

private<internal<protected<internal protected <public

理由是internal只能在本程序集中访问,而protectedinternal protectedpublic可以跨程序集访问。在同一个程序集中internal protected具有比protected更广泛的访问性(internal protected 可以在包容类外部访问,protected则不可以),public不受任何限制。

如果在成员声明中未指定修饰符,则使用默认的可访问性。不嵌套在其他类型中的顶级类型的可访问性只能是internalpublic。这些类型的默认可访问性是internal。嵌套类型(当然也包括方法或属性等)是其他类型的成员,它们可以具有下表(摘自MSDN)所示的声明的可访问性。

属于

默认的成员可访问性

该成员允许的声明的可访问性

enum

public

class

private

public

protected

internal

private

protected internal

interface

public

struct

private

public

internal

private

protected修饰符无法应用于struct,因为struct无法派生或继承。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值