C#阶段提高之---访问修饰符
修饰符用于修改类型和类型成员的声明。C#的访问修饰符就那么几种,但是深究起来是很有讲究的,有时间凭空想象会造成使用的错误。下来我来说说访问修饰符的使用。访问修饰符分为类型访问修饰符,类成员访问修饰符。其中类型修饰符一共两种:Internal,public。而成员的访问修饰符有public,private,protected,internal四种。
public 关键字是类型和类型成员的访问修饰符。 公共访问是允许的最高访问级别。对访问公共成员没有限制,如下例所示:
1: class Class1
2: {
3: public int x; // 没有访问限制
4: }
两个类中的互相访问没有限制:
1: class PointTest
2: {
3: public int x;
4: public int y;
5: }
6:
7: class Class1
8: {
9: static void Main()
10: {
11: PointTest p = new PointTest();
12: p.x = 10;
13: p.y = 15;
14: Console.WriteLine("x = {0}, y = {1}", p.x, p.y);
15: }
16: }
17: // Output: x = 10, y = 15
private修饰符就会出现限制了,请看:
1: class Employee2
2: {
3: private string name = "FirstName, LastName";
4: private double salary = 100.0;
5:
6: public string GetName()
7: {
8: return name;
9: }
10:
11: public double Salary
12: {
13: get { return salary; }
14: }
15: }
16:
17: class PrivateTest
18: {
19: static void Main()
20: {
21: Employee2 e = new Employee2();
22:
23: // The data members are inaccessible (private), so
24: // they can't be accessed like this:
25: // string n = e.name;
26: // double s = e.salary;
27:
28: // 'name' is indirectly accessed via method:
29: string n = e.GetName();
30:
31: // 'salary' is indirectly accessed via property
32: double s = e.Salary;
33: }
34: }
internal 关键字是类型和类型成员的访问修饰符。 只有在同一程序集的文件中,内部类型或成员才是可访问的,如下例所示:
1: public class BaseClass
2: {
3: // Only accessible within the same assembly
4: internal static int x = 0;
5: }
声明的是internal,在内部的成员或内部程序集中是可以访问的,出了程序集就没有访问的权限了。从当前程序集或从包含类派生的类型,可以访问具有访问修饰符 protected internal 的类型或成员。
此示例包含两个文件: Assembly1.cs 和 Assembly1_ a.cs。 第一个文件包含内部基类 BaseClass。 在第二个文件中,实例化 BaseClass 的尝试将产生错误。
1: // Assembly1.cs
2: // Compile with: /target:library
3: internal class BaseClass
4: {
5: public static int intM = 0;
6: }
7: // Assembly1_a.cs
8: // Compile with: /reference:Assembly1.dll--引用程序集Assembly1.dll
9: class TestAccess
10: {
11: static void Main()
12: {
13: //下面的实例化将产生错误
14: BaseClass myBase = new BaseClass();
15: }
16: }
提示错误可以看见:访问保护受到限制!
原因十分明确,第一个类声明的是internal类型,第二个类引用第一个程序集Assembly1.dll,但是已经出了这个程序集,因此无效的实例化。
protected 关键字是一个成员访问修饰符。 受保护成员在其所在的类中可由派生类实例访问。例子:
1: class A
2: {
3: protected int x = 123;
4: }
5:
6: class B : A
7: {
8: static void Main()
9: {
10: A a = new A();
11: B b = new B();
12:
13: // classes derived from A.
14: // a.x = 10;
15:
16: // OK, because this class derives from A.
17: b.x = 10;
18: }
19: }
语句 a.x = 10 生成错误,因为它是在静态方法 Main 中生成的,而不是类 B 的实例。
结构成员无法受保护,因为无法继承结构。
一个成员或类型只能有一个访问修饰符,但使用 protected internal 组合时除外。可以访问仅限于从包含类派生的当前程序集或类型。