技术图文:如何理解C#的internal限制修饰符?
背景
在程序设计领域,面向对象有三大特征:封装、继承、多态。而封装是通过private
、protected
、public
、internal
这样的限定修饰符实现的。
我们先来看一下微软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限制修饰符?相关推荐
- C#之internal访问修饰符
internal:中文翻译为内部的. 那么我们假如作为C#程序的开发者 当我们建立一个类的时候开始不写类的访问修饰符是什么样呢 class Test { //定义字段 internal protect ...
- 技术图文:01 面向对象设计原则
01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...
- java metrics.counter_技术专栏 | 深入理解Metrics(二):Counters
原标题:技术专栏 | 深入理解Metrics(二):Counters 本章会继续讲解Metrics的第二个工具:Counters. 1. Counters的使用 在account内部使用Counter ...
- 技术图文:排序技术在求解算法题中的应用
背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文. 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Lin ...
- 技术图文:C# 语言中的扩展方法
背景 前段时间,在知识星球立了一个Flag,在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点,于是先总结一下. 1.扩展方法概述 扩展方法能够向现有类型"添加" ...
- python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?
原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...
- amd插帧技术如何开启_联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程...
联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程 很多情况下可能我们都需要开启CPU虚拟化技术,例如我们需要打开安卓模拟器,在打开安卓模拟器的时候如果提示您需要CPU虚拟化技术,那么我 ...
- 阿里道延:我对技术架构的理解与架构师角色的思考
我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 Leader 找我的第一件事就是要解决大促的问题,第二件事就是解决安全生产的问题. 我带着这个命题进入 ...
- 新的一年,谈谈我对技术架构的理解
作者 | 道延 责编 | 张文 来源 | 转载自阿里巴巴中间件(ID:Aliware_2018) 我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 ...
最新文章
- Java中BASE64 编码
- 如何在公司局域网内访问不同网段的主机
- luogu P1393 P3157 动态逆序对
- 【项目实战课】基于Pytorch的MTCNN与Centerloss人脸识别实战
- quartus管脚分配后需要保存吗_掉电保存数据到EEPROM
- 【jQuery】smartMenu右键自定义上下文菜单插件(似web QQ)
- iOS AFNetWorking源码详解(一)
- HDU3709 Balanced Number
- 使电动机反转的matlab仿真图,基于MATLAB的电机仿真研究
- ROS笔记(38) Xbox360手柄控制移动
- 树莓派4b自带wifi_树莓派raspberry4B入坑指南 part-11 在命令行中设置wifi
- JMeter之Ramp-up Period(in seconds)说明
- 高速公路联网收费ETC设备可维护性技术要求(征求意见)
- 【Unscented Kalman Filter】C#无迹卡尔曼滤波Demo--两个示例附代码
- c51语言主函数,51单片机的基本c51语言程序介绍
- cmd进阶学习笔记(原创进阶)
- [SystemVerilog] 基于 FPGA 的数字钟设计
- [水晶报表]如何设置水晶报表(crystal reports)的字段自动换行
- arduino入门教程书籍推荐,arduino从入门到精通
- win如何卸载cuda8
热门文章
- 新手UI设计师需要掌握的知识和技能
- 零基础学习UI设计有哪些简单有效的方法
- HashMap和HashSet原理及底层实现
- 偷看日历?9款 APP 涉嫌过度获取权限
- python - 字符串的格式化输出
- python之深浅拷贝
- windows 系统常用操作
- Spring学习总结(7)——applicationContext.xml 配置文详解
- ibaits插入即获取主键(mssql,mysql,oracle)
- 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...