65.9K
CodeProject 正在变化。 阅读更多。
Home

访问修饰符

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.06/5 (9投票s)

2007 年 9 月 3 日

3分钟阅读

viewsIcon

48802

downloadIcon

451

访问修饰符的一些用法。

引言

访问修饰符是用于指定成员或类型的声明可访问性的关键字。 本节介绍了四个访问修饰符

  • public (没有访问限制)。
  • protected (访问仅限于类定义内以及从该类继承的任何类)。
  • internal (访问仅限于在当前项目程序集中定义的类)。
  • private (访问仅限于类定义内;如果未正式指定任何内容,则这是默认的访问修饰符类型)。
[public]
(没有访问限制 - 方法对任何人开放)
public 关键字是类型和类型成员的访问修饰符。 Public 访问是允许程度最高的访问级别。 访问公共成员没有任何限制。

示例

在下面的示例中,声明了两个类,CClass1CClass2CClass1 的公共成员 x 和 y 从 CClass2 直接访问。

// protected_public.cs

// Public access

using System;
class CClass1 
{
   public int x; 
   public int y;
}

class CClass2 
{
   public static void Main() 
   {
      CClass1 CC = new CClass1();

      // here is direct access to public members:

      CC.x = 3;
      CC.y = 5;
      Console.WriteLine("x = {0}, y = {1}", CC.x, CC.y); 
   }
}

输出

x = 3, y = 5

如果您想将公共访问级别更改为 private 或 protected,您将收到错误消息

'CClass1.y' is inaccessible due to its protection level.

[protected] protected 关键字是成员访问修饰符。
受保护的成员可以从声明它的类中访问,也可以从任何派生自声明此成员的类的类中访问。

基类的受保护成员仅在通过派生类类型进行访问时才可以在派生类中访问。 例如,请考虑以下代码段

class XX 
{
   protected int x = 111;
}

class YY : XX 
{
   void F() 
   {
      XX a = new XX();  
      YY b = new YY();  
      a.x = 7;   // Will give an error

      b.x = 7;   // OK

   }
}

语句 a.x=7 会生成错误,因为 XX 没有从 YY 派生

注意:“结构成员不能受保护,因为结构不能被继承。”

从未派生自受保护成员类的类中引用受保护成员是错误的。

示例

在此示例中,类 DerivedClass 派生自 CClass; 因此,您可以直接从派生类访问基类的受保护成员。

// protected_keyword.cs

using System;
class CClass 
{
   protected int a; 
   protected int b;
}

class DerivedClass: CClass 
{
   public static void Main() 
   {
      DerivedClass dC = new DerivedClass();

      //here is direct access to protected members:

      dC.a = 3;
      dC.b = 5;
      Console.WriteLine("a = {0}, b = {1}", dC.a, dC.b); 
   }
}

输出

a = 3, b = 5

如果将 xy 的访问级别更改为 private,编译器将发出错误消息

'CClass.a' is inaccessible due to its protection level.
'CClass.b' is inaccessible due to its protection level.
[internal]
internal 访问的一个常见用途是基于组件的开发,因为它使一组组件能够以私有方式进行协作,而无需暴露给应用程序代码的其余部分。 例如,用于构建图形用户界面的框架可以提供 Control 和 Form 类,这些类使用具有 internal 访问权限的成员进行协作。 由于这些成员是 internal 的,因此它们不会暴露给使用框架的代码。

在定义它的程序集之外引用具有 internal 访问权限的成员是错误的。

注意:即使不能使用 C# 重写 internal virtual 方法,也可以使用某些语言(例如使用 Ilasm.exe 的文本 Microsoft 中间语言 (MSIL))进行重写。

示例

此示例包含两个文件,Assembly1.csAssembly2.cs。 第一个文件包含一个 internal 基类,BaseClass。 在第二个文件中,尝试访问基类的成员将产生错误。

文件 Assembly1.cs

// Assembly1.cs

// compile with: /target:library

internal class BaseClass 
{
public static int IntM = 0;
}

文件 Assembly2.cs

// Assembly2.cs

// compile with: /reference:Assembly1.dll

// CS0122 expected

class TestAccess 
{
   public static void Main() 
   {
      BaseClass myBase = new BaseClass();   // error, BaseClass not visible outside assembly

   }
}

internal 关键字是类型和类型成员的访问修饰符。 Internal 成员只能在同一程序集中的文件中访问。

[private]- (访问仅限于类定义内)
private 关键字是成员访问修饰符。 Private 访问是允许程度最低的访问级别。 Private 成员只能在其声明的类或结构的体内访问。

同一主体中的嵌套类型也可以访问这些 private 成员。

在声明它的类或结构之外引用 private 成员是编译时错误。

示例

在此示例中,Emp 类包含一个公共成员 Name 和一个私有成员 Salary。 可以直接访问公共成员,而必须通过公共方法 GetSalary() 访问私有成员。

// private_keyword.cs

using System;
class Emp 
{
   public string name = "xx";
   double salary = 100.00;   // private access by default

   public double GetSalary() {
      return salary;
   }
}

class MainClass 
{
   public static void Main() 
   {
      Emp e = new Emp();

      // Accessing the public field:

      string n = e.name; 
      
      // Accessing the private field:

      double s = e.GetSalary();    
   }
}

在前面的示例中,如果您尝试通过使用这样的语句直接访问私有成员

double s = e.salary;

您将收到错误消息

'Emp.Salary' is inaccessible due to its protection level. 

关注点

可以使用访问修饰符指定以下五个可访问性级别
public、protected、internal、internal protected、private

© . All rights reserved.