C#学习笔记之运算符重载

发布时间:2020-05-21编辑:脚本学堂
本文介绍下,有关C#的运算符重载的相关内容,有需要的朋友,参考下吧。

1,在类中不能总是调用方法和属性,有时还需要一些其他工作。
例如 if(a==b)对于这个语句,在默认情况下会比较引用a和b,检测这两个引用是否指向内存中同一个地址,而不是检测两个实例是否包含同样的数值,所以需要们来告诉
编译器如果处理==的操作,就是运算符的重载。

2,常用的【+, -, *, /, %, ++, --, &, |, <<, >>, !, ~】必须成对重载的【==,!=】【>=,<】【<=,>】
 
3,运算符重载一般应用于 以下几个方面
数学计算,图形图像处理,财务计算,字处理文本分析等等。。

4,实例
  

复制代码 代码示例:
  //结构体Vector用于处理三位矢量运算 
    struct Vector 
    { 
        public double x, y, z; 
     
        public Vector(double x, double y, double z) 
        { 
            this.x = x; 
            this.y = y; 
            this.z = z; 
        } 
     
        /*
         * 复制构造函数
         * ※作为结构的构造函数,要求必须在构造体内初始化所有字段,否则编译器会有错
         */ 
        public Vector(Vector v) 
        { 
            x = v.x; 
            y = v.y; 
            z = v.z; 
        } 
     
        public override string ToString() 
        { 
            return "(" + x + "." + "" + y + "." + "" + z + ")"; 
        } 
     
        /* 一,相加的重载
         * ① 大体与方法的声明相近,operator修饰符告诉编译器这是一个运算符的重载
         * ② 两个参数对于二元运算符来说,第一个是放在左边的值,第二个是右边的
         * ③ C#要求所有的运算符重载都声明为public和static,
         *    这是为了表示运算符的重载与他们类或者结构相关联,而不是与实例相关联。
         * ④ 如果我们重载的+运算符,编译器会自动执行+=运算符的重载,实际上是一个先相加再赋值的过程  
         */  
        public static Vector operator +(Vector lhs, Vector rhs) 
        {  
            //结果返回用Vector 
            Vector result = new Vector(lhs); 
     
            result.x += rhs.x; 
            result.y += rhs.y; 
            result.z += rhs.z; 
     
            return result; 
        } 
     
        /* 二,更多的重载
         * 下面的相乘的重载只能处理 double * Vector的代码
         * 而对于Vector * double的代码却不能编译,我们需要自己来提供想方法的重载一样的方式
         */ 
        public static Vector operator *(double lhs, Vector rhs) 
        { 
            return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z); 
        } 
     
        //对于Vector * double的代码我们可以像上类那样在写一次,也可以向下面这样,执行翻转顺序操作 
        //这样就可以调用既存的重载方法,便于代码维护 
        public static Vector operator *(Vector lhs, double rhs) 
        { 
            return rhs * lhs; 
        } 
     
        /* 三,比较运算符的重载
         * ① C#要求成对重载比较运算符,如果重载了 == 就必须重载 !=
         * ② 比较运算符的重载必须返回bool型的值
         * ③ 重载 == 和 !=最好重载Euals和GetHashCode()方法,因为它们执行相同逻辑(参考C#==>相等)
         * */ 
        public static bool operator ==(Vector lhs, Vector rhs) 
        { 
            if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z) 
            { 
                return true; 
            } 
            else 
            { 
                return false; 
            } 
        } 
     
        public static bool operator !=(Vector lhs, Vector rhs) 
        { 
            return !(lhs == rhs); 
        } 
     
        //※我们重写了== 和 !=但没有重写Euals和GetHashCode方法,实际执行中编译器会有一个警告 
    }

    就是这些了,C#运算符的重载相关内容,希望对大家有所帮助。