CLR via C#学习日记

本文详细介绍了C#中的构造器及方法概念,包括实例构造器与类、结构的区别,类型构造器的工作原理,以及操作符重载、转换操作符方法、扩展方法等高级特性。文中还特别提醒不要在构造器中调用虚方法以避免意外行为。

今天看到第8章——方法

1.实例构造器和类

构造器方法在“方法定义元数据表”中叫.ctor 创建一个实例时,首先分配托管堆内存,再初始化附加字段(类型对象指针和同步索引块),最后就是调用类型的实例构造器来初始化对象字段。

注意:不要在构造器中调虚方法。因为实例化的进程是先基类初始化再到派生类的初始化,如果在调用基类的构造器时,调用了虚方法,而派生类又重写了虚方法,这时就会产生意想不到的变化,由于此时还没调用派生类的构造器,所以派生类的字段还没初始化,很容易出现意料之外的变化。

2.实例构造器和结构

C#编译器不会为值类型生成默认的构造器。如果必须要编写构造器的话,就必须编写带参数的构造器,同时必须在构造器中初始化全部字段。而定义一个结构类型的变量时,C#编译器不会调用构造器,必须显式调用构造器。

3.类型构造器

也称静态构造器,而且总是私有的,不能显式添加private,因为静态构造器是由CLR调用的。

类型构造器只能访问到静态字段,而且在类中定义静态字段,CLR最终生成的IL会显示一个.cctor的方法,并且静态字段的初始化放在里面。

类型构造器只有在初次访问类的成员时才会加载类到AppDomain,并且调用。

4.操作符重载

CLR没有操作符重载的概念,操作符重载本质上也就是一个静态方法。

5.转换操作符方法


6.扩展方法

扩展方法其实就是一个静态方法,不过其第一个参数的形参上要添加this关键字,并且只有第一个参数才能用this标记。同时扩展方法必须定义在顶级类中,不能在嵌套类中定义,还有潜在的版本问题,也就是说,假如Microsoft以后扩展了某个类的方法,同时我们之前也扩展了相同的方法名,那么编译器就会调用Microsoft的方法,而不是我们定义的方法。

7.分部方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值