程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 一起學習《C#高級編程》3--運算符重載,

一起學習《C#高級編程》3--運算符重載,

編輯:C#入門知識

一起學習《C#高級編程》3--運算符重載,


  運算符的重載。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),那用戶定義的類型的轉換又是怎樣的呢?

下期敘述, 用戶定義類型的強制轉換

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved