访问修饰符






2.06/5 (9投票s)
2007 年 9 月 3 日
3分钟阅读

48802

451
访问修饰符的一些用法。
引言
访问修饰符是用于指定成员或类型的声明可访问性的关键字。 本节介绍了四个访问修饰符
- public (没有访问限制)。
- protected (访问仅限于类定义内以及从该类继承的任何类)。
- internal (访问仅限于在当前项目程序集中定义的类)。
- private (访问仅限于类定义内;如果未正式指定任何内容,则这是默认的访问修饰符类型)。
示例
在下面的示例中,声明了两个类,CClass1
和 CClass2
。 CClass1
的公共成员 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
如果将 x
和 y
的访问级别更改为 private,编译器将发出错误消息
'CClass.a' is inaccessible due to its protection level. 'CClass.b' is inaccessible due to its protection level.
在定义它的程序集之外引用具有 internal 访问权限的成员是错误的。
注意:即使不能使用 C# 重写 internal virtual 方法,也可以使用某些语言(例如使用 Ilasm.exe 的文本 Microsoft 中间语言 (MSIL))进行重写。
示例
此示例包含两个文件,Assembly1.cs
和 Assembly2.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 成员是编译时错误。
示例
在此示例中,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