一起學習《C#進階編程》3--運算子多載

來源:互聯網
上載者:User

標籤:

  運算子的重載。C++的開發人員應該很熟悉這個概念,但這對Java 和 VB 開發人員確實全新的。

  對於一些數值間的運算,如果通過方法來指定運算規則的話,不免會繁瑣,這時就可以利用運算子的重載。

  例:

  Matrix a,b,c;  //定義矩陣對象

  Marix d=c*(a+b);

  如果用不支援運算子多載的語言的話,就必須定義方法,通過調用方法來進行計算:

  Marix d=c.Muliply(a.Add(b));

  結果很不直觀

  

  運算子的重載,在數學或物理建模會經常用到(比如座標,向量,矩陣,函數運算等)。還有比形,財務方面。。當然,如果你要用於計算日期,比如兩個DateTime相乘,沒人會攔你,雖然在概念上沒有任何意義,哈哈。

 

  其實,之前我們在編寫代碼的時候都會使用過運算子的重載,雖然我們自己沒定義重載運算子,但C#預設有幫我們實現了。

int myInt=3;uint myUint=2;double myDouble=13.2;long myLong=myInt+myUint;double myDouble=myDouble+myInt;double myDouble2=myInt+myDouble;

"+"運算子,會接受兩個參數,然後根據參數尋找最匹配的運算子的重載方法

上面的long myLong=myInt+myUint;和double myDouble2=myInt+myDouble;調用的是不同版本的重載。

在C#中,編譯器會自動匹配最適合的重載方法,就如 對於double和int型資料,“+”運算子沒有帶這種複合參數的重載,所以編譯器就認為,最匹配的“+”重載是兩個double類型相加,所得到數是double類型也就不奇怪 了

 

那麼對於自訂的類型會怎樣呢,這樣的話就得自己定義運算子的重載啦。

定義一個Vector結構,表示一個三維數學座標 (x,y,z)

struct Vector    {        private double x, y, z;        public Vector(double x,double y,double z)        {            this.x = x;            this.y = y;            this.z = z;        }        public Vector(Vector vec)        {            this.x = vec.x;            this.y = vec.y;            this.z = vec.z;        }                public override string ToString()        {            return "(" + x + "," + y + "," + z + ")";        }        //+運算子多載        public static Vector operator + (Vector lhs,Vector rhs)        {            Vector result=new Vector();            result.x=lhs.x+rhs.x;            result.y=lhs.y+rhs.y;            result.z=lhs.z+rhs.z;            return result;//返回兩個3維座標相加後的值        }    }
  

static void Main(string[] args)
{
//首先定義3維座標組象
Vector vec1 = new Vector(1, 0, -2);
Vector vec2 = new Vector(2, -1, 5);
Vector vec3 = vec1 + vec2;


Console.WriteLine(vec1.ToString()); //輸出(1,0,-2)
Console.WriteLine(vec2.ToString()); //輸出(2,-1,5)
Console.WriteLine(vec3.ToString()); //輸出(3,-1,3)
Console.ReadLine();
}


  當然還可以定義更多的重載運算,相加,相減,相乘。還可以標量與向量相乘,比如 2*(1,2,3)

public static Vector operator *(double lhs,Vector rhs)
{
return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
}

對於2.0*(1,2,3)和2*(1,2,3)都會調用這個重載。  但是,對於(1,2,3)*2,得另外重載一個方法

public static Vector operator *(Vector lhs,double rhs)
{
return rhs * lhs;
}

這裡,沒必要像上一個方法那樣重新運算過程,直接重用上面的代碼。。這個闡述了代碼的簡潔思想,也提高了代碼的可維護性。

相信,接下來寫向量相乘的話,也不是難事了,就不多寫了。

 

當然,還有就是比較符的重載,包括下面3對:

==和!=

>和<

>=和<=

其實,重載方法的操作是一樣的,把上例重點"+"運算子改為 比較子。

public static bool operator ==(Vector lhs,Vector rhs)
{
return ???
}

 

竟然寫了一個小時,0:11了,趕緊睡覺!

下期內容: 常見的系統預製數實值型別的轉換(比如 float轉換成double),那使用者定義的類型的轉換又是怎樣的呢?

下期敘述, 使用者定義型別的強制轉換

一起學習《C#進階編程》3--運算子多載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.