CLR Via C# 读书笔记-第9、10、11、12、13章(参数、属性、事件、泛型、接口)


第九章 参数

以传引用的方式想方法传递参数
  • out和ref对于CLR没啥区别,生成的IL代码基本一样。
    而out和ref对于C#来说,out代表在传参数时,被调用的方法不指望你以及初始化好了,所以不会去读参数的值,最后必须向参数写入。而ref,调用者必须初始化好,被调用方法可以读或写。

第十章 属性

  • 匿名类型和元组被创建出来,就不可以改变
  • 调用属性访问器的性能,当调用get、set时,JIT会将代码直接内联(嵌入)到调用代码中,避免产生调用的性能问题。

第十一章 事件

  • 编译器如何实现事件:e.g. public event EventHandler<NewMailEventArgs> NewMail;
  1. 生成一个EventHandler<NewMailEventArgs>私有委托字段
  2. 生成add_和remove_函数
  3. 编译器在托管程序集元数据中生成一个事件记录项,这个记录项,包含了基础委托类型,然后还引用了add,remove方法
  • 可以像使用get,set定义属性一样,利用add,remove定义事件

第十二章 泛型

  • 泛型提供了另一种代码重用:算法重用
  • 泛型优势
  1. 源码的保护,针对算法
  2. 类型安全,e.g. 例如List<int>无法add string,像ArrayList 什么东西都往里加
  3. 清晰的代码
  4. 更好的性能,针对值类型装箱拆箱
  • System.Collections.Concurrent 提供线程安全的泛型集合
  • System.Collections.Generic 提供了常用的泛型接口
  • 泛型类型称为开放类型 无法实例化,当所有的类型参数T未真实类型时,称为封闭类型
  • 开放类型中定义的静态成员,每个封闭类型都会有一份这个静态成员
  • 如果嫌<>造成混乱以及可读性问题,可以使用using IntList = System.Collections.Generic.List<int>; 并且typeof(IntList) == typeof(List<int>)

第十三章 接口

  • 接口之间的继承可以理解为包含
  • 值类型也可以实现接口,但是必须得装箱,因为只有通过检查类型对象指针才能知道确切类型
  • 显式\隐式实现接口方法看下面的代码及结果
internal sealed class SimpleType : IDisposable {
    public void Dispose() { Console.WriteLine("public Dispose"); } 隐式实现
    void IDisposable.Dispose() { Console.WriteLine("IDisposable Dispose"); } 显式实现
}

public sealed class Program {
    public static void Main() {
        SimpleType st = new SimpleType();

        // 调用公共 Dispose 方法实现
        st.Dispose();

        // 调用 IDisposable 的 Dispose 方法的实现
        IDisposable d = st;
        d.Dispose();
    }
}

结果
public Dispose
IDisposable Dispose 
  • 泛型接口优点
  1. 类型安全,会减少大量装箱
  2. 类型可以同时实现一个接口多次 e.g. public sealed class Number : IComparable, IComparable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值