C# 访问修饰符internal的访问范围误区释疑

  一、前言                                              

MSDN关于访问修饰符的访问级别解释:

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

使用这些访问修饰符可指定下列五个可访问性级别:

public:访问不受限制。

protected:访问仅限于包含类或从包含类派生的类型。

Internal:访问仅限于当前程序集。

protected internal:访问限制到当前程序集或从包含派生的类型的类别。

private:访问仅限于包含类型。

  二、认知误区                                        

  internal,英文含义是“内部的”,这时候基础不扎实的同学,可能就混淆了这个“内部的”的确切含义,到底是指“同一命名空间”的内部,还是“同一程序集”的内部,本人就是突然被问到这个问题的时候,真的就犹豫了,而且曾经一度以为就是“同一命名空间”的内部(话外:我们太多时候都自以为了,其实只要自己稍微MSDN查一下,就很清楚了)。

  第一部分已经摘抄了微软MSDN官方的解释,其实这个内部就是“同一程序集”的内部,也就是说,internal修饰的方法或者属性,只要是在同一个程序集的中的其他类都可以访问,如果二者不在同一命名空间,只要使用using引用上相应的命名空间即可,这里,从另外一个方面也间接看出命名空间并不是界定访问级别的,而是保证全局的类唯一性的,下面就从现实生活中解释下internal的实际作用。

  三、释疑                                              

  都说艺术源于生活,编程也是一门艺术,所以一样也是可以成生活中找到相应的场景,下面我们以实际生活场景来描述internal修饰符的作用。

  某公司的某技术中心,发文规定即日起,中心内的“打印机”仅限本中心的各个部门使用,其他中心的人员不能使用。这个现实生活的场景中,技术中心其实就是个程序集,而每个部门相当于不同的类,当然部门可以有相应的标签,相当于不同的命名空间,其实就是进行逻辑划分,职责不同的部门属于不同的命名空间就可以理解了。而我们的“主角”打印机的旁边就会被贴上公告“本中心的打印机只能本中心使用。。。。”,此时就相当于给打印机打上了internal修饰符了。其他中心的同学们,再也用不上本中心的打印机了。

  下面我们用代码来描述上面的场景:

  1.   我们先在一个公共的类库中(程序集)定义一个打印机的类
    1.  1 namespace CommonAsset
       2 {
       3     public class Printer
       4     {
       5         private bool _isBad;
       6         /// <summary>
       7         /// 打印机是否坏了
       8         /// </summary>
       9         public bool IsBad
      10         {
      11             get { return _isBad; }
      12             set { _isBad = value; }
      13         }
      14 
      15         public void Print()
      16         {
      17             Console.WriteLine("开始打印!");
      18         }
      19     }
      20 }

       

  2. 然后我们在创建一个中心A(程序集),分别定义各个部门,且属于不同的命名空间
    1.   
       1 namespace CenterA.Administration
       2 {
       3     public class DepartmentB
       4     {
       5         internal Printer PrinterB { get; set; }
       6         public DepartmentB()
       7         {
       8             PrinterB = new Printer();
       9         }
      10     }
      11 }
      12 
      13 
      14 namespace CenterA.Technology
      15 {
      16     public class DepartmentA
      17     {
      18         internal Printer PrinterA { get; set; }
      19         public DepartmentA()
      20         {
      21             PrinterA = new Printer();
      22         }
      23 
      24         public void PrintSomething()
      25         {
      26             if (PrinterA.IsBad)
      27             {
      28                 CenterA.Administration.DepartmentB departmentB = new CenterA.Administration.DepartmentB();
      29                 departmentB.PrinterB.Print();
      30             }
      31             else
      32             {
      33                 PrinterA.Print();
      34             }
      35         }
      36     }
      37 }

       

  3. 上面可以看见,DepartmentB和DepartmentA虽然不在同一个命名空间,但由于同属于CenterA这个程序集,DepartmentA是可以访问DepartmentB中的
    Printer 的。

 

转载于:https://www.cnblogs.com/liuww/p/5335003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值