背景

在程序设计领域,面向对象有三大特征:封装、继承、多态。而封装是通过privateprotectedpublicinternal这样的限定修饰符实现的。

我们先来看一下微软CSDN官方对这些限定修饰符的解释:

  • private:是允许的最低访问级别,私有成员只有在声明它们的类和结构体中才是可访问的。
  • protected:受保护成员在其所在的类中可由派生类实例访问。
  • public:类型和类型成员的访问修饰符,是允许的最高访问级别,对访问公共成员没有限制。
  • internal:只有在同一程序集的文件中,内部类型或成员才可访问。

我们再来看如下的代码:

// 代码段1
namespace Animal
{internal class Dog{public int Age;public bool Sex;}
}
// 代码段2
namespace ConsoleApp
{using Animal;class Program{static void Main(string[] args){Dog al = new Dog();al.Age = 20;Console.WriteLine("Age:{0}", al.Age);}}
}

第一段代码和第二段代码定义在同一个项目的不同文件中。

  • 第一段代码:在命名空间Animal中,定义了被internal限定的Dog类型。
  • 第二段代码:在命名空间ConsoleApp中,首先using Animal,之后在Program的Main方法中使用这个类型。

大家猜测一下,在编译时该段代码会报错吗?要回答这个问题,就要涉及到对internal这个限定修饰符的理解。


技术分析

internal,英文含义是“内部的”,这时候基础不扎实的同学,可能就混淆了这个“内部的”的确切含义,到底是指“同一命名空间”的内部,还是“同一程序集”的内部,本人就是突然被问到这个问题的时候,真的就犹豫了,而且曾经一度以为就是“同一命名空间”的内部。

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

程序集的概念:

  • 程序集构成了 .NET 应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。
  • 程序集是为协同工作而生成的类型和资源的集合,这些类型和资源构成了一个逻辑功能单元。
  • 程序集采用可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式,是 .NET 应用程序的构建基块 。

至此,就能回答上面的问题,在编译时代码不会报错,会输出"Age:20"。

我们接着看如下的代码:

// 代码段1
namespace Animal
{internal class Dog{public int Age;public bool Sex;}
}
// 代码段2
namespace ConsoleApp
{using Animal;class Program{static void Main(string[] args){Dog al = new Dog();al.Age = 20;Console.WriteLine("Age:{0}", al.Age);}}
}

第一段代码定义在一个类库(dll)项目中,第二段代码定义在一个控制台应用程序(exe)项目中。

由于两段代码所属的程序集不同,所以第二段代码在编译时会发生错误 “CS0122 “Dog”不可访问,因为它具有一定的保护级别”。


总结

到此为止,我们就把internal这个限定修饰符介绍完毕了,即internal在同一个程序集中可以看作是public的,但在不同的程序集中是无法访问的,与是否在同一命名空间无关。好了,今天就到这里吧!See You!


参考文献

  • https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/public
  • https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/protected
  • https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/private
  • https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/internal
  • https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/index

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

技术图文:如何理解C#的internal限制修饰符?相关推荐

  1. C#之internal访问修饰符

    internal:中文翻译为内部的. 那么我们假如作为C#程序的开发者 当我们建立一个类的时候开始不写类的访问修饰符是什么样呢 class Test { //定义字段 internal protect ...

  2. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  3. java metrics.counter_技术专栏 | 深入理解Metrics(二):Counters

    原标题:技术专栏 | 深入理解Metrics(二):Counters 本章会继续讲解Metrics的第二个工具:Counters. 1. Counters的使用 在account内部使用Counter ...

  4. 技术图文:排序技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文. 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Lin ...

  5. 技术图文:C# 语言中的扩展方法

    背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下. 1.扩展方法概述 扩展方法能够向现有类型"添加" ...

  6. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  7. amd插帧技术如何开启_联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程...

    联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程 很多情况下可能我们都需要开启CPU虚拟化技术,例如我们需要打开安卓模拟器,在打开安卓模拟器的时候如果提示您需要CPU虚拟化技术,那么我 ...

  8. 阿里道延:我对技术架构的理解与架构师角色的思考

    我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 Leader 找我的第一件事就是要解决大促的问题,第二件事就是解决安全生产的问题. 我带着这个命题进入 ...

  9. 新的一年,谈谈我对技术架构的理解

    作者 | 道延    责编 | 张文 来源 | 转载自阿里巴巴中间件(ID:Aliware_2018) 我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 ...

最新文章

  1. Java中BASE64 编码
  2. 如何在公司局域网内访问不同网段的主机
  3. luogu P1393 P3157 动态逆序对
  4. 【项目实战课】基于Pytorch的MTCNN与Centerloss人脸识别实战
  5. quartus管脚分配后需要保存吗_掉电保存数据到EEPROM
  6. 【jQuery】smartMenu右键自定义上下文菜单插件(似web QQ)
  7. iOS AFNetWorking源码详解(一)
  8. HDU3709 Balanced Number
  9. 使电动机反转的matlab仿真图,基于MATLAB的电机仿真研究
  10. ROS笔记(38) Xbox360手柄控制移动
  11. 树莓派4b自带wifi_树莓派raspberry4B入坑指南 part-11 在命令行中设置wifi
  12. JMeter之Ramp-up Period(in seconds)说明
  13. 高速公路联网收费ETC设备可维护性技术要求(征求意见)
  14. 【Unscented Kalman Filter】C#无迹卡尔曼滤波Demo--两个示例附代码
  15. c51语言主函数,51单片机的基本c51语言程序介绍
  16. cmd进阶学习笔记(原创进阶)
  17. [SystemVerilog] 基于 FPGA 的数字钟设计
  18. [水晶报表]如何设置水晶报表(crystal reports)的字段自动换行
  19. arduino入门教程书籍推荐,arduino从入门到精通
  20. win如何卸载cuda8

热门文章

  1. 新手UI设计师需要掌握的知识和技能
  2. 零基础学习UI设计有哪些简单有效的方法
  3. HashMap和HashSet原理及底层实现
  4. 偷看日历?9款 APP 涉嫌过度获取权限
  5. python - 字符串的格式化输出
  6. python之深浅拷贝
  7. windows 系统常用操作
  8. Spring学习总结(7)——applicationContext.xml 配置文详解
  9. ibaits插入即获取主键(mssql,mysql,oracle)
  10. 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...