• C#关于操作符重载与转换


     随便写写

    首先,假设我们有一个Person类型

    其类型定义如下

      class Person
        {
            public string Name { get; set; } = "Person";
            public int Age { get; set; } = 18;
    
            public Person() { }
    
            public Person(string name,int age)
            {
                this.Name = name;
                this.Age = age;
            }
    
            public Person(string name) : this(name, 18) { }
            public Person(int age) : this("Person", age) { }
            
    
        }

    在正常情况下,我们让两个Person类型相加,是不可能的,例如:

    那么如何能让两个Person类型相加,然后返回一个Person类型呢

    例如,我想让名字为"张三"年龄为19的Person加上另一个名字为"李四",年龄为20的Person

    然后返回一个名字为"张三李四",年龄为39的Person

    那么就需要用到重载"+"号这个操作符了

    所以,代码就如下,在Person中重载

         /// <summary>
            /// 重载+号
            /// </summary>
            /// <param name="p1"></param>
            /// <param name="p2"></param>
            /// <returns>返回一个Person类型</returns>
            public static Person operator+(Person p1,Person p2)
            {
                //将两个相加的Person类型分别让他们的
                //名字和年龄相加后的值赋值给被返回的Person类型
                Person p3 = new Person(p1.Name + p2.Name, p1.Age + p2.Age);
                return p3;
            }

    然后我们就可以在Main中来相加两个Person类型了

    看图

    这样就成功了

    然后其它的诸如

    而关键点就在于如果你要重载操作符就必须格式如下

    白话:public static 返回类型 operator被重载的操作符(本类型,要与之操作的类型)

    正文:public static Person operator+(Person p1,Person p2)   => 意思为:我要让两个Person类型相加,然后返回一个Person类型

    甚至你可以把返回类型改为int,然后两个Person类型相加后,你返回一个int类型的数据回去

    例如返回  p1.Age+p2.Age  这样,在将两个Person类型相加之后,将得到一个int类型的数据,其值就是相加的两个Person类型的Age值的相加值

    还有个要注意的是,

    如果你重载了 == 操作符,就必须要重载 != 因为它们是成对,还有其它成对运算符

    而且重载了 == 后,还应该重载 Equals,以及GetHashCode

    ===========================================================================================================

    下面再说说转换操作符

    还是说上面的那个Person吧

    例如,我非要让

    Person p=30;

    正常情况下,是不可能的,但如果我这样在Person中写就行了

     public static implicit operator Person(int age)
            {
                return new Person(age);
            }

    格式的话,就是固定死的,implicit关键字,如果没记错的话就是代表可以隐式转换

    还有个显示转换的,我忘了,不好意思,懒得查资料了

    这一段代码的意思就是

    我要让一个Person类型的数据,能够给它一个int类型的值

    例如

    =============================================================================================

    后记:写得比较少,只拣了两个例子去随便说了下,其实自己感觉就这两个例子就够了

    其它的自己多尝试,语法格式都是固定死了的,怎么写就看自己的思想有多么天马行空了

    好了,最后我们来利用刚才说的东西,去解决一下下面这道题

    怎么让 

    a==1 && a==2 && a==3 =true

    怎么做呢,看我们来调皮一下吧

    首先,我们不管a是什么类型,反正不太可能是int类型,因为不管原始a等于多少,上述表达式似乎都不为true

    那么我们自己来建个类型为Rational

    我们要做的就一件事

    为Rational重载 == 操作符

    让它不管与什么int类型的数字比较都返回true  (够调皮吧)

    看代码吧:

    class Rational
        {
            public int Val { get; set; } = 0;
    
            public Rational()
            {
    
            }
    
            public Rational(int val)
            {
                this.Val = val;
            }
            
            /// <summary>
            /// 我们重载了==操作符
            /// </summary>
            /// <param name="r"></param>
            /// <param name="val"></param>
            /// <returns></returns>
            public static bool operator==(Rational r,int val)
            {
                //只返回一个true是为了让所有与Rational类型相比对的int类型
                //都返回true
                //因为重载了==,所以必须重载!=
                //其实还应该重载Equals,以及GetHashCode
                //因为它们都是判断相等的类型
                
                return true;
            }
    
            public static bool operator !=(Rational r, int val)
            {
                return true;
            }
            
        }

    然后在Main中试试吧

     static void Main(string[] args)
            {
                Rational a = new Rational();
                bool result = a == 1 && a == 2 && a == 3;
                Console.WriteLine(result);
                Console.ReadKey();
            }

    你会发现,为true,是吧

  • 相关阅读:
    jquery 使用on方法给元素绑定事件
    bootstrap 学习笔记(部分)
    ajax 调用 webService
    ASP.NET 上传文件
    SQL 表 数据备份
    在控制台程序中,添加config文件
    webConfig的使用
    C# 下载文件的心得
    JS将页面中表格,导出到Excel中(IE中)
    Yahoo 军规(部分)
  • 原文地址:https://www.cnblogs.com/rbzz/p/9519310.html
Copyright © 2020-2023  润新知