Microsoft.Net框架程序设计学习笔记(12):操作符重载、转换操作符、引用参数、可变数目参数...

本文详细介绍了CLR中操作符重载的概念及其实现原理,包括如何通过特殊方法实现+等操作符的功能,并探讨了隐式与显式转换操作符的区别。此外,还介绍了引用参数与可变数目参数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作符重载方法:

  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长数组给该参数是合法的。

转载于:https://www.cnblogs.com/free722/archive/2011/03/27/1996950.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值