可访问性级别

使用访问修饰符 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、付费专栏及课程。

余额充值