操作符重载方法:

  CLR对操作符重载一无所知,它甚至都不认识操作符是什么。我们选择的编译语言定义了每个操作符的含义,以及当遇到它们时产生什么样的代码。

  如在C#中,应用于基元数值类型上的+符号会使编译器产生将两个数相加的代码。

  虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载。对于CLR来讲,重载操作符仅仅是一些方法而已。

  以下代码:

class Complex
{
public static Complex operator+(Complex c1, Complex c2)
{......}
}

  编译器会产生一个名为op_Addition的方法定义,该方法定义条目上有一个specialname标记,表示这是一个“特殊”方法。当编译器遇到+操作符时,它会去看其中的操作数类型中有哪一个定义了参数类型和操作数类型兼容、名为op_Addition的specialname方法。如果存在这样的方法,编译器将产生调用该方法的代码。

  如果我们查看一些核心的.Net框架类库类型(Int32、Int64等),我们会看到它们没有定义任何操作符重载方法,原因是CLR提供了直接操作这些类型实例的IL指令。

转换操作符方法:

  转换操作符本质上仍然是一些方法,它们可以将对象从一个类型转换为另一个类型。

  代码示例:

class Rational
{
public Rational(Int32 numerator)
{
......
}

public Rational(Single value)
{
......
}

public Single ToSingle(){......}

public Int32 ToInt32(){......}

//由一个Int32类型隐式构造一个Rational并返回
public static implicit operator Rational(Int32 numerator)
{
return new Rational(numerator);
}

//由一个Single类型隐式构造一个Rational并返回
public static implicit operator Rational(Single value)
{
return new Rational(value);
}

//由一个Rational显式返回一个Int32
public static explicit operator Int32(Rational r)
{
return r.ToInt32();
}

//由一个Rational显式返回一个Single
public static explicit operator Single(Rational r)
{
return r.ToSingle();
}
}

  经编译器编译后每一个定义的转换操作符都产生了一个方法,方法原型如下:

  public static Rational op_Implicit(Int32 numberator)
  public static Rational op_Implicit(Single value)
  public static Int32 op_Explicit(Rational r)
  public static Single op_Explicit(Rational r)

  转换操作符的方法名称总为op_Implicit或op_Explicit。对于那些转换过程中不可能丢失精度或数量级的转型操作,我们应该为其定义一个隐式转换操作符;对于那些有可能丢失精度或数量级的转型操作,我们应该为其定义一下显式转换操作符。

引用参数:

  CLR允许我们按引用的方式来传递参数。C#中我们可能用out和ref关键字来进行引用方式传递参数。

  关键字out和ref的不同之处在于哪个方法负责初始化参数。如果一个方法的参数被标识为out,则在调用该方法前可以不初始化该参数,且被调用方法不能直接读取参数值,它必须在返回前为该参数赋值。如果一个方法的参数被标识为ref,则在调用该方法前必须首先初始化该参数。被调用方法可以任意读、写该参数。

可变数目参数:

  有时,能定义一个接受可变数目参数的方法会为我们的开发工作带来很多方便。

  代码示例:

static int Add(params Int32[] values)
{
int sum = 0;
foreach (int i in values)
{
sum
+= i;
}
return sum;
}

  params关键字告诉编译器在指定的参数上应用一个ParamArrayAttribute定制特性的实例。因为params关键字仅是该特性的一个缩写,所以Add方法的定义原型为下面的样子:

static Int32 Add([ParamArray] Int32[] values)
{}
  只有方法的最后一个参数才可用params关键字来标记。该参数必须为一个一维数组,但类型可以任意。传递null或一个0长数组给该参数是合法的。
posted on 2011-03-27 15:14  辛勤的代码工  阅读(348)  评论(0编辑  收藏  举报