欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-01 19:15:23
随便写写 首先,假设我们有一个Person类型 其类型定义如下 在正常情况下,我们让两个Person类型相加,是不可能的,例如: 那么如何能让两个Person类型相加,然后返回一个Person类型呢 例如,我想让名字为"张三"年龄为19的Person加上另一个名字为"李四",年龄为20的Person ......

 随便写写

 

首先,假设我们有一个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类型相加,是不可能的,例如:

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

那么如何能让两个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类型了

看图

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

这样就成功了

然后其它的诸如

 

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

 

白话: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类型的值

例如

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

 

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

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

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

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

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

怎么让 

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,是吧