《CLR via C#》读书笔记---06 类型和成员基础
核心知识归纳图
6-1 类型中成员的本质
颜色归一
编译器支持了C#提供的各种各样的类型成员,CLR对其一无所知,都是IL代码大小不同
不同的类型成员因复杂度不同,编译器映射出的IL代码量也不尽相同
编译器对各种成员用一种“公共数据格式”来区分,可以视为是一种flag。编译器解析flag生成不同的IL。
6-2 类型的可见性
类型的可见性修饰符仅有两个:public && internal(default)
语义:供所有类型使用 && 供程序集内所有类型使用
当我试图为类型定义为private时,编译提示
- 感悟:没有private修饰类型也是对的。实际中没有孤立存在的类型。实现了一个功能势必会让人调用。除非两种情况:一是没有用的代码;二是从Main到所有的功能都容纳在一个类型中,想来也是恐怖。
【语法】
B中引用using System.Runtime.CompilerServices;
在B的任意一个类型的命名空间上面加上[assembly: InternalsVisibleTo(“A”)]
这样A就可以见到B程序集中任意类型
语法参考 http://fwhyy.com/2010/11/csharp-a-friend-assembly/
6-3 成员的可访问性
CLR定义的关键字有6个,C#映射了其中5个
这里特别阐释一下:protected internal,被这个关键字(这都两个单词了)修饰的成员,可以被任何程序集中该类型派生类 或 定义程序集中的类型访问,这里是或的关系,意思是两者都可以。
CLR | C# | info |
---|---|---|
Private | private | 成员只能由定义类型或任何嵌套类型中的方法访问 |
Family | protected | 成员只能由定义类型、任何嵌套类型中的方法、任何程序集的派生类型方法访问 |
FamilyandAssembly | 无 | |
Assembly | internal | 成员只能由定义程序集中的方法访问 |
FamilyorAssembly | protected internal | 成员只能由定义类型、任何嵌套类型中的方法、任何程序集的派生类型方法、定义程序集中的方法访问访问 |
Public | public | 成员只能由任何程序集的任何方法访问 |
- 想访问成员,其定义类型先可见(想吃糖,需要找到装糖的盒子)。遇到成员是public访问不了,也许原因就在这里
- 成员访问不到报的错Exception有FiledAccessException && MethodAccessException
- 提倡显示声明成员可访问性(隐式默认是限制最大的可访问性)
- C#重写不可以变更可访问性;CLR允许重写放宽
- 接口的成员必须是public,默认也是public
- 所以init的时候编译器已经做了这部分工作,这也是上面为什么说“通常”
- 类型叫“可见性”,类型的成员叫”可访问性”
- 我猜测:类型能看到就是能看到,很直接,叫“可见”,成员在类型之中,毕竟是包了一层,想想还是挺科学的。
- 这里只是强调一下,虽然都用一个词,不能说叫错,但毕竟不专业,就像有些人对象和类型不分的叫。
- 类型的可见性和成员的可访问性有必要谨慎定义吗?
6-4 静态类型
本质:sealed与abstract共同修饰
- 不能继承、实现接口(abstract)
- 没有.ctor(abstract)
- 不能创建实例(sealded)
- 成员皆静态,不能作为参数、字段、局部变量
当你若干时间后不记得这些特征,这是正常的事情,只需要记得“静态”,与类型实例相反
6.5 分部类型
- 使用“partial”关键字,可以将一个类、接口、结构定义在多个文件中(不可跨程序集)
- 本质:CLR对其一无所知
- 好处:
- 多个代码文件可以让多人同时编辑协作
- 代码逻辑独立整理
- 我们一个类中代码多,想给他分分类别整理,除了抽出去以外,可以整理放在多个文件中
- WinForm中的disgner.cs和edit的地方就是一种使用
6.6组件、多态和版本控制
什么是组件?
- 做一个笔记本屏幕需要的玻璃,我们可以称它为屏幕的组件;做一个笔记本需要的屏幕,我们可以称它为笔记本的组件;出售一个笔记本时外面的纸箱子,外面可以称它为完整出售笔记本的组件……
- 在开发中,一个字段、方法,可以是一个组件;一个控件、一个界面可以是一个组件;一个功能、一个模块是一个组件……
- 在这里组件特别指的是“Assembly程序集”。一个Assembly是一个Component。像我们开发时候用过的一些三方的dll,像Dev、Donetbar、FastReport、Log4、NPOI……这些我们只需要引用几个组件就可以使用它们封装的功能,这些是对外公用的组件,里面包含了自己的开发信息,像版本号、公钥……;像我们开发项目里面的程序集,仅是私用,切割模块,大多没有定义那些开发信息
维护版本期间做些什么?
像我现在从事的软件开发,有些Realease期间就是发布一些小的版本,没有大功能,就是来修复堆积的bug和一些小功能的开发
切记的是”克己”,不要去修改大的东西,不要自己看着一个有点规模或逻辑复杂的模块去重构,一方面时间是否够;一方面改的依赖多那测试的复杂度也是翻倍;另一方面影响接下来的进度和计划
- 尤其修改基类务必谨慎,原因无他,牵扯依赖多
.NET Framework中提供的版本号怎么用?
主要和次要,代表某一个大的功能模块开发;内部版本和修订,代表在这个大的功能下不断的修复和增强
- 例如v5.5.0.0中开发一个大的模块【考勤功能】,那v5.5.2.1、v5.5.2.12就是在考勤的方面的完善,想开发一个报表功能就变成v5.6.0.0
- 这是当初设定的设计
现在不同的公司不一样,只要能分清版本号就可以了。有的只用3位数字表达版本号;有的用奇偶数来表达不同含义的版本
什么是版本变更?
- 已发布软件的代码只要修改,那版本就算变更了。哪怕是没有意义的改变;哪怕修改的就是一个字段;哪怕只是Review代码的命名
版本控制C#提供的5个关键字
C# | info |
---|---|
abstract | 抽象,修饰的类无法构造实例,修饰的方法无法有主体 |
virtual | 这个成员可由派生类型重写 |
override | 重写基类的成员 |
sealed | 密封,修饰的类,无法被继承;与override结合修饰的属性和方法,其派生类无法重写该属性和方法 |
new | 被修饰的子类成员和基类同名的成员没有关系,隐藏基类该成员 |
密封类中的虚方法调用性能大于非密封类中的虚方法。运行密封对象实例中虚方法,编译器知道该实例被密封了,少走虚方法的那套继承多态的路子,自然快了
====以下内容暂时保留,并不认同作者放在这里的意图,我会将其总结在第八章的方法中======
- 静态方法是对象的方法
- 重载
- CLR支持的重载:方法名相同,返回值类型、参数类型或参数类型顺序、个数不同
- C#支持的重载:返回值不计算入内
- 静态方法、虚方法、普通方法,编译器加入Flag做标记,对应生成不同的IL
- 尽量少的用虚方法
- 虚方法调用速度比普通速度慢
- 虚方法调用无法内联,速度更慢一点
- 虚方法导致版本维护脆弱
- 版本维护的重点是稳定中谋发展,虚方法的修改会涉及多个依赖,有不稳定的因素。
- 多态重载的方法技巧
- 可以将复杂的逻辑抽取一个虚方法,其他普通重载调用该虚方法
- 子类重写这个复杂的虚方法,调用父类相关重载的方法,最后调用的是子类的重写的方法
《CLR via C#》读书笔记---06 类型和成员基础相关推荐
- 《CLR via C#》读书笔记 之 类型和成员基础
第六章 类型和成员基础 2013-02-27 6.2 类型的可见性 6.3 成员的可访问性 6.6 组件.多态和版本控制 6.2 类型的可见性 返回 类有两种可见性: (1) public ...
- 推荐系统实践读书笔记-06利用社交网络数据
推荐系统实践读书笔记-06利用社交网络数据 自从搜索引擎谷歌诞生后,大家都在讨论互联网的下一个金矿是什么.现在,几乎所有的人都认为那就是社交网络.根据尼尔森2010年的报告,用户在互联网上22%的时间 ...
- 数据之道读书笔记-06面向“自助消费”的数据服务建设
数据之道读书笔记-06面向"自助消费"的数据服务建设 数据底座建设的目标是更好地支撑数据消费,在完成数据的汇聚.整合.联接之后,还需要在供应侧确保用户更便捷.更安全地获取数据.一方 ...
- 《Java8实战》读书笔记06:Parallel Stream 并行流
<Java8实战>读书笔记06:Parallel Stream 并行流 第7章 并行数据处理与性能 7.1 并行流 7.1.1 将顺序流转换为并行流 7.1.2 测量流性能 7.1.3 正 ...
- 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...
- 构建之法读书笔记06
构建之法读书笔记06 阅读之前: 到最后了,其实这本书我初读的心态并不好,假期我还会再读一遍.这篇是关于项目的尾声就是发布之类的以及大的方向未来这个行业的东西.老实说,我选这个专业就是因为他和电 ...
- 《数字图像处理》读书笔记2:数字图像处理基础
<数字图像处理>读书笔记2:数字图像处理基础 1 人类视觉感知 1.1 眼睛构造图 1.2 基本概念: 1.2.1 亮度适应(Brightness Adaptation) 1.2.2 主观 ...
- 类型的设计--类型和成员基础(一)
6.1类型和成员基础 6.2类型的可见性 6.3成员的可见性 CLR术语 C#术语 描述 Private private 成员只有定义该成员的类型中的方法或该类型的所有嵌套类型中的方法访问 Famil ...
- 《深入浅出DPDK》读书笔记(一):基础部分知识点
本文内容为读书笔记,摘自<深入浅出DPDK>. 1.传统上,网卡驱动程序运行在Linux的内核态,以中断方式来唤醒系统处理,这和历史形成有关.早期CPU运行速度远高于外设访问,所以中断处理 ...
最新文章
- ncbi查找目的基因序列_使用NCBI设计qPCR引物方法
- linux空白屏幕,如何在Linux中的Logitech R400上使空白屏幕键正常工作?
- 【Python】Pygame入门
- php include不可用,无法设置PHP include_path
- python工资一般多少西安-西安学习Python哪里好多少钱
- 如何在 Mac 上的“音乐”应用和 iTunes 中创建 Genius 播放列表?
- java restlet 教程_java – Restlet Protocol.FILE用法
- 计算机网络实验指导书 pdf,《计算机网络》实验指导书.pdf
- 小生我怕怕私房版OllyDBG全自动下断版
- java调试报告_java,生成测试报告.docx
- 一年中的最后一天说说_2019最后一天说说唯美句子
- 为什么说Redis单线程效率高
- 计算机网络拓扑有,计算机网络拓扑
- codevs 1419 藤原妹红
- 对不同的人说不同的话的职场口才分享
- 上海迪士尼“疯狂动物城”主题园区启动主要施工
- 空间统计(二)分析模式 A
- 中国象棋软件-引擎实现(三)着法生成
- 思维:分析框架化,模型化
- 初来乍到,IT职场人,有些黑话要先了解(IT行业常用术语缩写)
热门文章
- CHIL-ORACLE-创建用户
- (swing读书笔记)Swing Look And Feel(1)
- 大学生创新创业大赛案例_创新创业大赛获奖名单_大学生创新创业大赛获奖案例...
- 2022年A特种设备相关管理(电梯)考试题模拟考试平台操作
- [转] 全国测绘事业单位(转)
- Android 使用shape实现虚线或者虚线框
- 带时滞的病毒模型计算模板【基于matlab的动力学模型学习笔记_1】
- vue移动端长按文字、图片阻止浏览器默认行为
- Unity Pro 2019 for mac(3D游戏动画开发工具) v2019.2.21f1
- Git详解之七:自定义Git