隨便寫寫 首先,假設我們有一個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類型相加,是不可能的,例如:
那麼如何能讓兩個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,是吧