C#高手必须掌握的4个要点:访问修饰符/可访问性级别/可访问域/可访问性级别的使用限制

本文详细介绍了C#中的访问修饰符及其使用规则,包括public、protected、internal、private和protectedinternal等五个可访问性级别,并解释了它们如何影响类、接口、字段等成员的可访问域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,访问修饰符

访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性。C#有四个重要的访问修饰符:

使用这些访问修饰符可指定下列五个可访问性级别:

public:访问不受限制。

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

Internal:访问仅限于当前程序集。

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

private:访问仅限于包含类型。

与访问修饰符相关的三个方面:

二,可访问性级别

使用访问修饰符 publicprotectedinternalprivate 可以为成员指定以下声明的可访问性之一。

声明的可访问性 含义

public

访问不受限制。

protected

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

internal

访问仅限于当前程序集。

protected internal

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

private

访问仅限于包含类型。

一个成员或类型只能有一个访问修饰符,使用 protectedinternal 组合时除外。

命名空间上不允许使用访问修饰符。命名空间没有访问限制。

根据发生成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。

不嵌套在其他类型中的顶级类型的可访问性只能是 internalpublic。这些类型的默认可访问性是 internal

嵌套类型是其他类型的成员,它们可以具有下表所示的声明的可访问性。

属于 默认的成员可访问性 该成员允许的声明的可访问性

enum

public

class

private

public

protected

internal

private

protected internal

interface

public

无 //说明接口中的方法和属性隐含是公共及抽象的

struct

private

public

internal

private

//因为结构不能派生,所以结构中成员没有protected 和protected internal可访问性级别

嵌套类型的可访问性取决于它的可访问域,该域是由已声明的成员可访问性和直接包含类型的可访问域这二者共同确定的。但是,嵌套类型的可访问域不能超出包含它的类型的可访问域。

三,可访问域

成员的可访问域指定程序段中可以引用成员的位置。如果成员嵌套在其他类型中,其可访问域由该成员的可访问性级别和直接包含类型的可访问域共同确定。

顶级类型的可访问域至少是声明它的项目的程序文本,即该项目的整个源文件。嵌套类型的可访问域至少是声明它的类型的程序文本,即包括任何嵌套类型的类型体。嵌套类型的可访问域决不能超出包含类型的可访问域。这些概念在以下示例中加以说明。

示例:

该示例包含一个顶级类型 T1 和两个嵌套类 M1 和 M2。这两个类包含具有不同声明的可访问性的字段。在 Main 方法中,每个语句后都有注释,指示每个成员的可访问域。注意,试图引用不可访问的成员的语句被注释掉了。如果希望查看由引用不可访问的成员所导致的编译器错误,请逐个移除注释。

四,可访问性级别的使用限制

声明类型时,最重要的是查看该类型是否必须至少与其他成员或类型具有同样的可访问性。例如,直接基类必须至少与派生类具有同样的可访问性。以下声明将导致编译器错误,因为基类 BaseClass 的可访问性小于 MyClass:

class BaseClass {...}  public class MyClass: BaseClass {...} // Error

下表汇总了对使用声明的可访问性级别的限制。

上下文 备注

类类型的直接基类必须至少与类类型本身具有同样的可访问性。

接口

接口类型的显式基接口必须至少与接口类型本身具有同样的可访问性。

委托

委托类型的返回类型和参数类型必须至少与委托类型本身具有同样的可访问性。

常数

常数的类型必须至少与常数本身具有同样的可访问性。

字段

字段的类型必须至少与字段本身具有同样的可访问性。

方法

方法的返回类型和参数类型必须至少与方法本身具有同样的可访问性。

属性

属性的类型必须至少与属性本身具有同样的可访问性。

事件

事件的类型必须至少与事件本身具有同样的可访问性。

索引器

索引器的类型和参数类型必须至少与索引器本身具有同样的可访问性。

运算符

运算符的返回类型和参数类型必须至少与运算符本身具有同样的可访问性。

构造函数

构造函数的参数类型必须至少与构造函数本身具有同样的可访问性。

示例

下面的示例包含不同类型的错误声明。每个声明后的注释指示了预期的编译器错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值