C# 运算符重载

一、简介

  平时我们使用的运算符都是C#内置定义好的,比如+-*/等等,但是我们项目中遇到复杂一点的运算方式,只能我们自己重载相应的运算符。比如两个类相加+,我们可以重载类的+运算符,在函数里面,自定义我们的规则。

operator 关键字定义静态成员函数,来允许用户定义的类型重载运算符。


二、详细说明

不过并非所有运算符都可以进行重载,并且其他运算符具有限制

运算符

可重载性

+-!~++--truefalse

这些一元运算符可以进行重载。

+, -, *, /, %, &, |, ^, <<, >>

这些二元运算符可以进行重载。

==, !=, <, >, <=, >=

比较运算符可以进行重载(但是请参阅此表后面的备注)。

&&, ||

条件逻辑运算符无法进行重载,但是它们使用 & 和 |(可以进行重载)来计算。

[]

数组索引运算符无法进行重载,但是可以定义索引器。

(T)x

强制转换运算符无法进行重载,但是可以定义新转换运算符(请参阅 explicitimplicit)。

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

赋值运算符无法进行重载,但是 +=(举例)使用 +(可以进行重载)来计算。

=.?:??->=>f(x)ascheckeduncheckeddefaultdelegateisnewsizeoftypeof

这些运算符无法进行重载。

备注:

对于比较运算符 <>,以及 <=>=,也成立。


三、示例

定义一个rect类,存储宽高。主要讲解 +的重载

class Rect

{

  public Rect(int w, int h)

  {

    W = w;

    H = h;

  }

  int W;

  int H;

  //重载 类的+运算符 

  public static Rect operator +(Rect x, Rect y)

  {

    return new Rect(x.W + y.W, x.H + y.H);  //自定义代码

  }

}

调用

  调用特别简单,就像使用默认+运算符一样

Rect x = new Rect(3,5);
Rect y = new Rect(2, 2);

Rect my = x + y;  //调用自定义的 + 运算符

四、总结

  • 尽可能的不要改变运算符本身的含义
  • 不同于扩展方法,所重载的方法必须是在被重载的类型内部,且用关键字operator
  • 二元重载符,其中一个参数必须是封闭类型(就是自定义类型)
  • C#要求所有的运算符重载都声明为publicstatic,必须是类的静态方法,这表示它们与它们的类或结构相关联,而不是与实例相关联
  • C# 不允许重载=运算符,但如果重载例如+运算符,编译器会自动使用+运算符的重载来执行+=运算符的操作。
  • 运算符只能采用值参数,不能采用ref或out参数