第二部分 设计类型:第8章 方法

8.1 实例构造器和类(引用类型)

构造器是将类型实例初始化为良好状态的一种特殊方法。.ctor->constructor

创建引用类型的实例过程:
为实例的数据字段分配内存 => 初始化对象的附加字段(类型对象指针、同步块索引) => 调用类型的实例构造器来设置对象的初始状态

实例构造器不能被继承,所以不能将这些修饰符应用于构造器:virtual、new、override、sealed、abstract。

没有显示定义构造器,C#编译器会默认给一个无参的构造器。在它的实现中,只是简单调用基类的无参构造器。

 

•类的修饰符为abstract,编译器生成的默认构造器的可访问性为protected,否则构造器会被赋予public可访问性。
•类的修饰符为static(sealed和abstract),编译器不会在类的定义中生成一个默认构造器。
•如果基类没有提供无参构造器,那么派生类必须显式调用一个基类的构造器,否则编译器会报错。

一个类型可以定义多个实例构造器,每个构造器必须有不同的签名,每个构造器可以有不同的可访问性。(签名:返回值+参数)

类的实例构造器在访问从基类继承的任何字段之前,必须先调用基类的构造器。如果派生类的构造器没有显示调用一个基类构造器,C#编译器会自动生成对默认的基类构造器的调用。最终,System.Object的公共无参构造器会得到调用,该构造器什么都不做直接返回,因为System.Object没有定义实例数据字段,所以它的构造器无事可做。

 

 

8.2 实例构造器和结构(值类型)

 值类型不需要定义构造器。

 出于对性能的考虑,CLR不会为包含在引用类型中的每个值类型字段都调用一个构造器。但值类型的字段会被初始化为0或null。

 

8.3 类型构造器
类型构造器也称为静态构造器、类构造器、类型初始化器。
类型构造器可应用于引用类型、值类型和接口(C#编译器不允许)。

类型构造器的作用是设置类型的初识状态。
类型默认没有定义类型构造器,定义也只能定义一个。类型构造器没有参数。

如何在C#中为引用类型和值类型定义类型构造器:

定义类型构造器必须将它们标记为static,类型构造器总是私有的,c#会自动把它们标记为private,不能人为添加访问修饰符。

 

 

 

 8.4操作符重载方法

CLR对操作符一无所知。至于CRL,操作符重载只是方法而已。

编译源码时,编译器会生成一个标识操作符行为的方法。CLR规范要求操作符重载方法必须是public和static方法。另外,C#(以及其他许多语言)要求操作符重载方法至少有一个参数的类型和当前定义这个方法的类型相同。为了使C#编译器能在合理的时间内找到要绑定的操作符方法。

 

 操作符和编程语言互操作性
使用不支持操作符重载的编程语言时,语言应该允许你直接调用希望的op_*方法(例如 op_Addition)。

 

8.5 转换操作符方法

当源类型和目标类型都是编译器的基元类型时,编译器自己就知道如何生成转换对象所需要的代码(如:Tyte=>Int32)。

如果源类型或目标类型不是基元类型,编译器会生成代码,要求CLR执行转换(强制转型)。这时,CLR只是检查源对象的类型和目标类型(或者从目标类型派生的其他类型)是不是相同。

将对象从一个类型转换成一个完全不同的类型,如:System.Xml.Linq.XElement=>Boolean

假设FCL包含了Rational(有理数)类型,将Int32或Single转换成Rational。
Rational类型应该定义只有一个参数的公共构造器,这个参数是源类型的一个实例。还应该定义无参数的公共实例方法ToXxx(和普遍使用的ToString方法相似),每个方法都将定义类型的一个实例转换成Xxx类型。

你可能感兴趣的:(方法)