第九章 参数
以传引用的方式想方法传递参数
- out和ref对于CLR没啥区别,生成的IL代码基本一样。
而out和ref对于C#来说
,out代表在传参数时,被调用的方法不指望你以及初始化好了,所以不会去读参数的值,最后必须向参数写入。而ref,调用者必须初始化好,被调用方法可以读或写。
第十章 属性
- 匿名类型和元组被创建出来,就不可以改变
- 调用属性访问器的性能,当调用get、set时,JIT会将代码直接内联(嵌入)到调用代码中,避免产生调用的性能问题。
第十一章 事件
编译器如何实现事件
:e.g. public event EventHandler<NewMailEventArgs> NewMail;
- 生成一个EventHandler<NewMailEventArgs>私有委托字段
- 生成add_和remove_函数
- 编译器在托管程序集元数据中生成一个事件记录项,这个记录项,包含了基础委托类型,然后还引用了add,remove方法
- 可以像使用get,set定义属性一样,利用add,remove定义事件
第十二章 泛型
- 源码的保护,针对算法
- 类型安全,e.g. 例如List<int>无法add string,像ArrayList 什么东西都往里加
- 清晰的代码
- 更好的性能,针对值类型装箱拆箱
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();
st.Dispose();
IDisposable d = st;
d.Dispose();
}
}
结果
public Dispose
IDisposable Dispose
- 类型安全,会减少大量装箱
- 类型可以同时实现一个接口多次 e.g. public sealed class Number : IComparable, IComparable