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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM