博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象的比较与排序(五):C#运算符重载
阅读量:7000 次
发布时间:2019-06-27

本文共 2344 字,大约阅读时间需要 7 分钟。

c#里的运算符重载是个不常出现的应用,同时也是个好玩的东西。
我们可以使用他来实现这样的需求:
当一个订单与另外一个订单相加形成一个新的订单。新订单的货物为两个订单的货物的并集,总价为两个订单的总价和。
下面实现看看
先做个辅助的货物类
public
 
class
 Merchandise
{
    
public int Count getset; }
    
public string Name getset; }
    
public double UnitPrice getset; }
}
然后来实现订单类
public
 
class
 Order
{
    
public double TotalPrices getset; }
    
public List<Merchandise> Merchadises getset; }
    
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;

可以看出,运算符重载看起来与标准静态方法声明类似,但它们使用关键字operator 和 运算符本身,而不是一个方法名。现在可以成功地使用 + 运算符和这个类。

注意:

1.要重载运算符,可给类添加运算符类型成员(它们必须是static)。

2.一些运算符有多种用途,(如 - 运算符就有一元和二元两种功能),因此我们还指定了要处理多少个操作数,以及这些操作数的类型。

3.一般情况下,操作数的类型与定义运算符的类相同,但也可以处理混合 类型的运算符。

贴上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-typeop-type2 中至少有一个必须是封闭类型(即运算符所属的类型)。例如,这将防止重定义整数加法运算符。

后两种形式声明了转换运算符。conv-type-inconv-type-out 中正好有一个必须是封闭类型(即,转换运算符只能从它的封闭类型转换为其他某个类型,或从其他某个类型转换为它的封闭类型)。

运算符只能采用值参数,不能采用 ref 或 out 参数。

任何运算符声明的前面都可以有一个可选的属性(C# 编程指南)列表。

 

转载于:https://www.cnblogs.com/eagle1986/archive/2012/02/03/2277414.html

你可能感兴趣的文章
php排序算法
查看>>
在if里赋值要注意=和==的优先级,==优先于=
查看>>
Delphi xe7 up1 调用android振动功能
查看>>
激励自己的话
查看>>
IOS 实现界面本地化(国际化)
查看>>
陶哲轩实分析命题 11.10.7
查看>>
《陶哲轩实分析》引理17.2.4证明_导数的唯一性
查看>>
站立会议5
查看>>
python中的常用模块(2)
查看>>
登陆的键盘敲击事件
查看>>
执行计划基础 统计信息
查看>>
python MD5加密方法
查看>>
mysql连接jdbc查询代码
查看>>
SpringMVC10数据验证
查看>>
处理异常Error resolving template [/login], template might not exist or might not be accessible by......
查看>>
洛谷 P1147 连续自然数和 Label:等差数列
查看>>
线程间的同步和通信机制
查看>>
Python脚本实现值更新事件赋值过程记录日志监控
查看>>
[bzoj 1503][NOI 2004]郁闷的出纳员
查看>>
Java课程上机实验1_ConnectionManager
查看>>