class constructor
operator overload
instance constructor -------> .ctor,实例构造函数
class constructor --------> .cctor,类型构造函数
CLR通过线程锁机制,保证每个AppDomain中,一个类型的 .cctor只被调用一次
类型构造器只能访问类型的静态字段。
private static int _x = 5
,这个是 .cctor 的简化语法,c#编译器会会自动生成一个 .cctor 方法。
操作符重载比如是 public
and static
的。
c#允许的一元操作符: +, - , !, ~, ++, --
c#允许的一元操作符: +, -, *, /, %, &, |, ^, <<, >>, < ,<= , >, >=
内联代码(Inline
) 可以让JIT编译器优化代码,减少方法调用,提升性能。
conversion operator
对于编译器能识别的基元类型,编译器自己就知道如何生成转换对象所需的代码。
但是对于非基元类型,编译器会生成代码调用,让CLR进行强制转型。
c#支持转换操作符(conversion operator ) 重载。
public sealed class Rational {
// Constructs a Rational from an Int32
public Rational(Int32 num) { ... }
// Constructs a Rational from a Single
public Rational(Single num) { ... }
// Convert a Rational to an Int32
public Int32 ToInt32() { ... }
// Convert a Rational to a Single
public Single ToSingle() { ... }
// Implicitly constructs and returns a Rational from an Int32
public static implicit operator Rational(Int32 num) {
return new Rational(num);
}
// Implicitly constructs and returns a Rational from a Single
public static implicit operator Rational(Single num) {
return new Rational(num);
}
// Explicitly returns an Int32 from a Rational
public static explicit operator Int32(Rational r) {
return r.ToInt32();
}
// Explicitly returns a Single from a Rational
public static explicit operator Single(Rational r) {
return r.ToSingle();
}
}
// 生成的IL代码
// 转换操作方法在IL中的名字只有 op_Implicit, op_Explicit两种
public static Rational op_Implicit(Int32 num);
public static Rational op_Implicit(Single num);
public static Int32 op_Explicit(Rational r);
public static Single op_Explicit(Rational r);
// 隐式和显示转换
public sealed class Program {
public static void Main() {
Rational r1 = 5; // Implicit cast from Int32 to Rational
Rational r2 = 2.5F; // Implicit cast from Single to Rational
Int32 x = (Int32) r1; // Explicit cast from Rational to Int32
Single s = (Single) r2; // Explicit cast from Rational to Single
}
}
extension method
扩展方法只能定义在顶级类(文件级别的类)中,不能定义在嵌套类中。
可以定义扩展方法的包括:
- 普通类
- 接口
- 枚举
- 委托
方法调用查找顺序:
- 类本身
- 基类或接口
- 扩展方法
所有的方法都有一个隐藏的this指针,如果是静态方法,则this指针为null。