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;

可以看出,运算符重载看起来与标准静态方法声明类似,但它们使用关键字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-type 和 op-type2 中至少有一个必须是封闭类型(即运算符所属的类型)。例如,这将防止重定义整数加法运算符。

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

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

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

对象的比较与排序(五):C#运算符重载相关推荐

  1. 运算符重载 - C++快速入门25

    运算符重载 让编程改变世界 Change the world by program 运算符重载 所谓重载,就是重新赋予新的含义.函数重载是对一个已有的函数赋予新的含义,使之实现新功能. 其实运算符也可 ...

  2. (C++学习笔记七)运算符重载

    九.运算符重载 1.Code : #include<iostream> using namespace std;//运算符重载的意义: //对已有的 运算符 重新进行定义,赋予其另一项功能 ...

  3. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  4. 运算符重载为类的成员函数

    运算符重载 运算符重载为类的成员函数后就可以像其他成员函数一样访问本类的数据成员了. 在类的外部通过类的对象,可以像原运算符的使用方式那样使用重载的运算符,比如,"+"运算符被重载 ...

  5. C++实现CMatrix类的构造、实现及运算符重载

    C++实现CMatrix类的构造.实现及运算符重载 前言 一.CMatrix类的实现代码 CMatrix.cpp CMatrix.h main.cpp 二.运行截图 三.总结 构造函数 析构函数 运算 ...

  6. 运算符重载(超详细)

    文章目录 运算符重载 1.运算符重载是什么 2.运算符重载实例 3.运算符重载操作原理 4.重载限制 5.使用其他运算符具体实现 运算符重载 1.运算符重载是什么 使对象操作更美观的技术. 运算符重载 ...

  7. 第五章运算符表达式和语句

    title: 第五章 运算符.表达式和语句 author: HardyDragon tags: C Notes 第五章 运算符.表达式和语句 5.1 循环简介 5.2 基本运算符 5.2.1 赋值运算 ...

  8. js数组对象按照中文拼音排序

    今天遇到一个需求如图所示,下拉框按照中文拼音排序,而我们下拉框给的都是接口传过来的对象,所以要想排序,还是稍微需要处理一下的 话不多说,我们先看一个demo,根据这个demo,我们就能完成,我们想要的 ...

  9. 黄浩老师cpp平时作业(十三)圆形正方形类 运算符重载组合类圆和点(排序与查找题目重复)

    解释:排序与查找题目与前面传重了,这个题目也没有面向对象,嗯,没有提醒老师,我不想多写题 狗头 基于类的链表稍后整理模板的时候上传吧,这题就不另传了,tas上有基于结构体的链表实现 运算符重载 //b ...

最新文章

  1. 在高中生物里我们提到和遗传有关的物质有染色体,染色质,基因,dna
  2. 高德地图多边形覆盖物添加、获取、删除
  3. max_connect_error的说明
  4. 当 position:sticky 遇到 bootstrap 浮动布局时候的踩坑记录
  5. 笔记-项目管理基础知识-项目目标
  6. App-V 4.6 SP1系列之五包加速器的制作
  7. sonar 分析的质量数据在数据库表中的存储和质量维度数值的研究
  8. python docx库使用样例_Python docx库用法示例分析
  9. 12面魔方公式图解法_三阶魔方入门
  10. 如何使用Native Messaging API 打开window程序
  11. html button跳转页面_HTML常用标签
  12. 【BZOJ2437】【codevs1949】兔兔与蛋蛋游戏,博弈+二分图匹配
  13. SpringBoot集成MyBatisPlus
  14. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(7-9)
  15. 51nod-1351:吃点心
  16. 随手记_思路历程_马原知识体系逻辑图解
  17. 定时获取AccessToken——萤石开放平台
  18. linux脚本两个分号,Linux Shell中各种分号和括号的用法总结
  19. 小布老师讲座笔记(五)
  20. 花仙里云课堂知识付费v1.2.25知识付费 教育 直播

热门文章

  1. POJ3080方法很多(暴力,KMP,后缀数组,DP)
  2. LA3989女士的选择
  3. 【错误记录】Android 应用运行报错 ( java.lang.VerifyError: Verifier rejected class androidx. | 逆向中遇到的问题 )
  4. 【Java 网络编程】TCP 传输机制 ( 数据拆分 | 排序 | 顺序发送 | 顺序组装 | 超时重发 )
  5. box-shadow实现曲线投影效果
  6. 2.对于所有对象都通用的方法_EJ
  7. 怎么寻回执行页内操作时的错误磁盘的数据
  8. 2017 ACM/ICPC(西安)赛后总结
  9. Enumeration接口
  10. 解决fstream不能打开带有中文路径文件的问题