C# 运算符重载

一、简介

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

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

 


 二、详细说明

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

运算符

可重载性

+-!~++--truefalse

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

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

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

==!=<><=>=

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

&&||

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

[]

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

(T)x

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

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

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

=.?:??->=>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参数
posted @ 2018-08-13 15:37  激情1995  阅读(1817)  评论(0编辑  收藏  举报