zoukankan      html  css  js  c++  java
  • 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参数
  • 相关阅读:
    zookeeper基础
    4. Zookeeper单机版安装
    3. 服务中间件Dubbo
    2. Maven工程的搭建
    Maven的优点
    应用架构的演进历史 MVC、 RPC、SOA 和 微服务架构
    js 正则表达式验证
    后台正则表达式验证部分部分总结
    Linux下记录登录用户历史操作
    Django使用Ace实现在线编辑器
  • 原文地址:https://www.cnblogs.com/01zxs/p/9468545.html
Copyright © 2011-2022 走看看