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:  }
提示错误可以看见:访问保护受到限制!
 
image 

原因十分明确,第一个类声明的是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 组合时除外。可以访问仅限于从包含类派生的当前程序集或类型。

原文地址:https://www.cnblogs.com/sunBolg/p/2477276.html