net学习笔记

1.使用VS设置应用程序生成平台,可以选择x86,x64或者是anyCPU。

当选择x86时,通过使用dumpbin.exe /headers XX.exe,可以发现,该文件包含一个PE32的头,并且有一个 32 bit word machine的说明。

当使用x64时,可以发现该文件包含一个PE32+的头,并且有一个 Application can handle large (>2GB) addresses的标识。

当选择anyCPU时,可以发现文件也包含一个PE32的头,但和X86不同的是,该文件和x64一样包含一个 Application can handle large (>2GB) addresses的标识。

2.方法参数中ref 和out 关键字

这两字都具有引用的作用,不同之处在于ref要求参数必须初始化,而out并不关注,在方法返回时,out关键字必须赋值,而ref不做要求。通过ildasm.exe查看两者的IL代码,如果只有参数修饰符不一样的情况下,生成的IL代码是一致的,都传递给函数的是一个参数的地址。

3.泛型实现代码复用,可以定义泛型引用类型、值类型、泛型接口和泛型事件,还可以有泛型方法,但是不能定义泛型枚举。泛型代码从IL编译到本地机器指令时,如果泛型类型是引用类型,则只会有一份拷贝,因为引用类型是一个指针,在同一平台上大小是固定且一致的,但是针对值类型,则会生成不同的本地指令,因为值类型的大小不一定一致,而且在一样大小的情况下,可能需要不同的CPU指令来操作。

4.协变和逆变的理解,泛型类型参数可以标记为三种状态(不可变、协变、逆变)。

协变和逆变一般用于泛型委托和泛型接口中,逆变可以理解为从基类型转变为派生类型的过程,协变可以理解为从派生类型转变为基类型的过程;

逆变用in关键字标记,标识这个位置的类型参数只作为输入使用,协变用out关键字标记,标识这个位置的类型参数只能作为输出使用;

对于一个泛型委托,如果一个类型被in标记,则这个类型在委托内部只会用作输入,此时我们想象一下,委托里头用的T的成员肯定是最基本的成员,所以再实际使用中,当我将T转为T的派生类型时,是不会出现类型安全问题的,因为T满足的话,T的派生肯定也是满足的。

对于一个协变类型,因为是输出,此时我们就可以正常理解为与派生类转为基类的过程等同。

原文地址:https://www.cnblogs.com/chyshx/p/13820870.html