前言

这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享

构造函数

  • 抽象类默认的构造函数可访问为protected,普通类默认为public
  • 派生类默认调用一个基类构造器(如果没有无参构造器,则需要显式调用)
  • 不通过构造函数创建对象?
    • 静态方法Object.MemberwiseClone,分配内存复制字节
    • 运行时序列化
  • 不要在构造器中调用会影响所构造对象的任何虚方法,如果虚方法重写,导致无法预测的行为
    • 这一点,在java中尤其明显,因为java的内联初始化是在基类初始化之后
    • 基类构造函数虚方法指向子类实现,可是子类并没有完全初始化完成,想象一下!
  • 构造实例初始化顺序
    1. 内联初始化(这一点和java不一样)
    2. 调用基类的构造器
    3. 调用构造器自己的代码
  • 值类型的构造器
    • 值类型总是提供默认构造器,所以总是可以实例化
    • 由于总是有默认构造器,值类型不允许使用内联初始化语法
    • 开发人员无法定义值类型的无参构造器,只能定义带参构造器
    • 基于栈的值类型字段都必须在读取之前写入(赋值),并且时全部字段。否则编译出错
    • 值类型在构造器中可以给this赋值,而引用类型的this则时只读的
  • 类型构造器(静态构造函数)
    • static并且强制可访问性为private
    • 一个AppDomain中只会执行一次,并且线程安全,适合单例模式
    • 值类型中可以定义类型构造器,但是永远不要这么做,为什么呢?
    • 手动调用类型构造器 RuntimeHelpers.RunClassConstructor方法
  • 构造器应该避免循环依赖
  • 值类型不允许使用实例字段的内联初始化,但是静态字段却可以,DateTime就是典型!
  • 静态析构器Finalize不存在,只能通过AppDomain.DomainUnload事件进行登记回调

类型构造器的性能考量

  • 时机的不确定性
    • 访问类的非继承字段或成员前 precise精确语义,时机精确
    • 访问静态字段或静态实例\实例方法前或者实例构造器之前,before-field-init语义
    • 字段初始化前语义时机不确定,因为CLR保证访问成员前运行静态构造器
  • 如果没有显式定义类型构造器,则静态字段使用beforefieldinit标记,否则不使用此标记
  • beforefieldinit可以优化调用,但是precise不可以精确调用
  • 静态字段只要在访问之前初始化就可以了,时机无所谓。而显式类型构造器可能包含具有副作用的代码,所以需要精确拿捏运行的时机

属性

  • 有参属性和无参属性,静态、实例、抽象和虚属性
  • 自动属性的缺点
    • 初始化默认值
    • 序列化
    • 调试的支持
  • 属性或索引器不可以作为out或ref参数传递
  • DateTime.Now是一个错误的设计,为什么?

Tips

  • 转型表达式会促使生成代码调用显式转换操作符方法。如果使用as或is,则永远不会调用这些方法
  • 引用参数
    • 引用参数 out 无须初始化、方法内不能读取参数值、必须写入  ref 必须初始化、方法内可以读取或写入
    • 引用传值,可以避免复制字节,提升执行效率
    • 引用传值ref和out可以应用于构造函数噢!
  • 建议:参数尽量使用弱类型参数(比如接口或抽象类),返回值最好使用强类型
  • 自动集合初始化器,编译器针对对象调用Add方法,否则编译出错
  • 代码内联
    • 是指将一个方法的代码直接编译到调用它的方法当中
    • 避免在运行时发出调用所产生的开销
    • JIT编译器在调试代码时不会内联属性方法,方便调试
    • 发布版本中,经过内联优化,可能比较快

读书笔记—CLR via C#章节8-10的更多相关文章

  1. 读书笔记—CLR via C#章节3

    这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...

  2. 读书笔记—CLR via C#章节11-13

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  3. 读书笔记—CLR via C#章节4-7

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  4. 读书笔记—CLR via C#章节1-2

    这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...

  5. 读书笔记—CLR via C#线程27章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  6. 读书笔记—CLR via C#同步构造28-29章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  7. 读书笔记—CLR via C#线程25-26章节

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  8. 读书笔记—CLR via C#异常和状态管理

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  9. 读书笔记—CLR via C#反射

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

随机推荐

  1. 批处理删除IIS的everyone、users的访问权限

    原文 批处理删除IIS的everyone.users的访问权限 以下批处理代码功能,实现的是,删除C盘的everyone.users用户对IIS的权限. 一.删除C盘的everyone的权限 cd/  ...

  2. System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    原文 System.BadImageFormatException: 试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B) 用C#调用DLL文件,运行后报错如下: Syste ...

  3. <%%>创建内联代码块(表达)

    其实<%%>很早之前见过它,将一个小的功能仅.别人不理解.今天偶尔,我们看到它的真面目,今天,给大家分享. 语法 代码块呈现(<%%>)定义了当呈现页时运行的内联代码或内联表达 ...

  4. android浏览器开发小技巧集锦(转)

    本人和朋友们做了一段时间浏览器,将一些小技巧分享出来,先写一部分,慢慢写,同时也为我们的浏览器打打广告 我们的浏览器将要上线,名叫沙发浏览 1.网页内的右键菜单 public boolean onLo ...

  5. Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表

    在上一边博客<Web版RSS阅读器(一)——dom4j读取xml(opml)文件>中已经讲过如何读取rss订阅文件了.这次就把订阅的文件读取到页面上,使用树形结构进行加载显示. 不打算使用 ...

  6. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  7. HDU 4946 Area of Mushroom 凸包 第八次多校

    题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...

  8. Java和Flex积分误差(一个)

    1.错误叙述性说明 at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency( ...

  9. ReportNG测试报告模板定制

      部分参考:http://tech.it168.com/a2013/0906/1530/000001530755_3.shtml ReportNG提供了简单的方式来查看测试结果,并能对结果进行着色, ...

  10. 内网穿透&UDP打洞

    这两天找度度重新回忆了一下关于内网穿透的事情,在百度文库上找到了两三篇写的比较通俗易懂的文章,把内网穿透做个简单总结. 首先文章建议 Cone NAPT 还有希望,要是 Symmetri NAPT 就 ...