• 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 组合时除外。可以访问仅限于从包含类派生的当前程序集或类型。

  • 相关阅读:
    多项式插值取模哈希标记法
    AC自助机
    [OIBH] 糖果盒(Candy Box)——又一个最大子矩形
    windows phone 之ListBox数据绑定
    WP学习笔记
    为TextArea添加maxlength属性
    让整个网页(LOGO图片)色调全部变灰的方法(CSS写法)
    JS调试加断点
    Container.ItemIndex 获取到行的序号
    c# Invoke 与 BeginInvoke
  • 原文地址:https://www.cnblogs.com/sunBolg/p/2477276.html
Copyright © 2020-2023  润新知