一,访问修饰符
访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性。C#有四个重要的访问修饰符:
使用这些访问修饰符可指定下列五个可访问性级别:
public:访问不受限制。
protected:访问仅限于包含类或从包含类派生的类型。
Internal:访问仅限于当前程序集。
protected internal:访问仅限于当前程序集或从包含类派生的类型。
private:访问仅限于包含类型。
与访问修饰符相关的三个方面:
-
可访问性级别:使用四个访问修饰符声明五个可访问性级别。
-
可访问域:指定在程序节的哪个位置可以引用成员。
-
可访问性级别的使用限制:概述了声明的可访问性级别的使用限制。
二,可访问性级别
使用访问修饰符 public、protected、internal 或 private 可以为成员指定以下声明的可访问性之一。
声明的可访问性 | 含义 |
---|---|
public | 访问不受限制。 |
protected | 访问仅限于包含类或从包含类派生的类型。 |
internal | 访问仅限于当前程序集。 |
protected internal | 访问仅限于从包含类派生的当前程序集或类型。 |
private | 访问仅限于包含类型。 |
一个成员或类型只能有一个访问修饰符,使用 protectedinternal 组合时除外。
命名空间上不允许使用访问修饰符。命名空间没有访问限制。
根据发生成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。
不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 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 |
下表汇总了对使用声明的可访问性级别的限制。
上下文 | 备注 |
---|---|
类类型的直接基类必须至少与类类型本身具有同样的可访问性。 | |
接口类型的显式基接口必须至少与接口类型本身具有同样的可访问性。 | |
委托类型的返回类型和参数类型必须至少与委托类型本身具有同样的可访问性。 | |
常数的类型必须至少与常数本身具有同样的可访问性。 | |
字段的类型必须至少与字段本身具有同样的可访问性。 | |
方法的返回类型和参数类型必须至少与方法本身具有同样的可访问性。 | |
属性的类型必须至少与属性本身具有同样的可访问性。 | |
事件的类型必须至少与事件本身具有同样的可访问性。 | |
索引器的类型和参数类型必须至少与索引器本身具有同样的可访问性。 | |
运算符的返回类型和参数类型必须至少与运算符本身具有同样的可访问性。 | |
构造函数的参数类型必须至少与构造函数本身具有同样的可访问性。 |
示例:
下面的示例包含不同类型的错误声明。每个声明后的注释指示了预期的编译器错误。