访问修饰符(C# 编程指南)

更新:2007 年 11 月

所有类型和类型成员都具有可访问性级别,用来控制是否可以在您程序集的其他代码中或其他程序集中使用它们。您在声明类型或成员时使用以下访问修饰符之一来指定其可访问性:

  • public
    同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。

  • private
    只有同一类或结构中的代码可以访问该类型或成员。

  • protected
    只有同一类或结构或者派生类中的代码可以访问该类型或成员。

  • internal
    同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。

  • protected internal
    同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。

下面的示例演示如何为类型和成员指定访问修饰符:

public class Bicycle
{
    public void Pedal() { }
}

不是所有访问修饰符都可以在所有上下文中由所有类型或成员使用,在某些情况下类型成员的可访问性受到其包含类型的可访问性的限制。以下各节提供了有关可访问性的更多详细信息。

类和结构的可访问性

直接在命名空间中声明的类和结构(即,没有嵌套在其他类或结构中的类和结构)可以是公共类和结构,也可以是内部类和结构。如果不指定访问修饰符,则默认为 internal。嵌套的类和结构还可以声明为私有类和结构。不可以从包含类型访问私有嵌套类型。

派生类的可访问性不能高于其基类型。换句话说,不能有从内部类 A 派生的公共类 B。如果允许这种情况,将会使 A 成为公共类,因为 A 的所有受保护的成员或内部成员都可以从派生类访问。

可以使用 InternalsVisibleToAttribute 使其他某些程序集能够访问您的内部类型。有关更多信息,请参见友元程序集(C# 编程指南)

类成员和结构成员的可访问性

可以使用五种访问类型中的任何一种来声明类成员(包括嵌套的类和结构)。结构成员无法声明为受保护成员,因为结构不支持继承。

成员的可访问性决不能高于其包含类型的可访问性。例如,在内部类型中声明的公共方法只具有内部可访问性。

如果类或结构的成员为属性、字段、方法、事件或委托,并且该成员是某个类型或具有参数或返回值类型,则该成员的可访问性不能超过该类型。例如,如果 C 不是公共类,则不能返回类 C 的公共方法 M。同样,如果 A 声明为私有,则类型 A 不能有受保护的属性。

用户定义的运算符必须始终声明为公共运算符。有关更多信息,请参见 operator(C# 参考)

析构函数不能具有可访问性修饰符。

若要设置类成员或结构成员的访问级别,请向该成员声明添加适当的关键字。下面是一些示例:

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}
说明:

protectedinternal 可访问性的意思是受保护“或”内部,而不是受保护“和”内部。换句话说,可以从同一程序集内的任何类(包括派生类)中访问 protectedinternal 成员。若要限制为只有同一程序集内的派生类可以访问,请将类本身声明为内部,并将其成员声明为受保护。

其他类型

直接用命名空间声明时,可以将接口声明为公共接口或内部接口,并且与类和结构一样,接口默认具有内部可访问性。接口成员始终是公共成员,因为接口的用途是让其他类型能够访问某个类或结构。访问修饰符不能应用于接口成员。

枚举成员始终是公共的,不能应用任何访问修饰符。

默认情况下,委托默认具有内部访问级别。

C# 语言规范

有关更多信息,请参见 C# 语言规范中的以下各章节:

  • 3.5 成员访问

  • 10.3.5 访问修饰符

请参见

概念

C# 编程指南

参考

类和结构(C# 编程指南)

接口(C# 编程指南)

private(C# 参考)

public(C# 参考)

internal(C# 参考)

protected(C# 参考)

class(C# 参考)

struct(C# 参考)

接口(C# 参考)