c#里的运算符重载

纵然是瞬间 提交于 2020-01-19 04:07:29
c#里的运算符重载是个不常出现的应用,同时也是个好玩的东西。
  我们可以使用他来实现这样的需求:
  当一个订单与另外一个订单相加形成一个新的订单。新订单的货物为两个订单的货物的并集,总价为两个订单的总价和。
  
  下面实现看看
  先做个辅助的货物类
  public class Merchandise
  {
   public int Count { get; set; }
   public string Name { get; set; }
   public double UnitPrice { get; set; }
  }然后来实现订单类
  public class Order
  {
   public double TotalPrices { get; set; }
   public List<Merchandise> Merchadises { get; set; }
  
   public static Order operator +(Order a, Order b)
   {
   Order newOrder = new Order()
   {
   TotalPrices = a.TotalPrices + b.TotalPrices
   };
   newOrder.Merchadises.AddRange(a.Merchadises);
   newOrder.Merchadises.AddRange(b.Merchadises);
   return newOrder;
   }
  }
  下面是客户端调用代码
   Order o1 = new Order { TotalPrices = 500.0 };
   o1.Merchadises.AddRange(
   new List<Merchandise>
   {
   new Merchandise{Name = "肥皂",Count=100,UnitPrice=3},
   new Merchandise{Name = "毛巾",Count=100,UnitPrice=2}
   }
   );
  
   Order o2 = new Order { TotalPrices = 8000.0 };
   o1.Merchadises.AddRange(
   new List<Merchandise>
   {
   new Merchandise{Name = "电视",Count=5,UnitPrice=1000},
   new Merchandise{Name = "DVD",Count=5,UnitPrice=600}
   }
   );
  
   Order o3 = o1 + o2;
  
  贴上MSDN的说明
  
  operator 关键字用于在类或结构声明中声明运算符。运算符声明可以采用下列四种形式之一:
  
  
  public static result-type operator unary-operator ( op-type operand )
   public static result-type operator binary-operator (
   op-type operand,
   op-type2 operand2
   )
   public static implicit operator conv-type-out ( conv-type-in operand )
   public static explicit operator conv-type-out ( conv-type-in operand )
  
  
  
  参数
  result-type
  运算符的结果类型。
  
  unary-operator
  下列运算符之一:+ - ! ~ ++ — true false
  
  op-type
  第一个(或唯一一个)参数的类型。
  
  operand
  第一个(或唯一一个)参数的名称。
  
  binary-operator
  其中一个:+ - * / % & | ^ << >> == != > < >= <=
  
  op-type2
  第二个参数的类型。
  
  operand2
  第二个参数的名称。
  
  conv-type-out
  类型转换运算符的目标类型。
  
  conv-type-in
  类型转换运算符的输入类型。
  
  备注
  前两种形式声明了用户定义的重载内置运算符的运算符。注意,并非所有内置运算符都可以被重载(请参见可重载的运算符)。op-type 和 op-type2 中至少有一个必须是封闭类型(即运算符所属的类型)。例如,这将防止重定义整数加法运算符。
  
  后两种形式声明了转换运算符。conv-type-in 和 conv-type-out 中正好有一个必须是封闭类型(即,转换运算符只能从它的封闭类型转换为其他某个类型,或从其他某个类型转换为它的封闭类型)。
  
  运算符只能采用值参数,不能采用 ref 或 out 参数。
  
  任何运算符声明的前面都可以有一个可选的属性(C# 编程指南)列表。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!