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

C#運算符重載 實現教程

編輯:關於C#
 

運算符重載是指允許用戶使用用戶定義的類型編寫表達式的能力。它允許用戶定義的類型與預定義的類型具有相同的功能。

例如,通常需要編寫類似於以下內容的代碼,以將兩個數字相加。很明顯,sum 是兩個數字之和。

int i = 5;
int sum = i + j;

如果可以使用代表復數的用戶定義的類型來編寫相同類型的表達式,那當然是最好不過了:

Complex i = 5;
Complex sum = i + j;

運算符重載允許為用戶定義的類型重載(即指定明確的含義)諸如“+”這樣的運算符。如果不進行重載,則用戶需要編寫以下代碼:

Complex i = new Complex(5);
Complex sum = Complex.Add(i, j);

此代碼可以很好地運行,但 Complex 類型並不能象語言中的預定義類型那樣發揮作用。

任何事情都有特定的時間和場所
運算符重載是一個容易引起誤解的語言功能,而且編程人員對待它的態度也大相徑庭。一些人認為:用戶使用這一功能編寫的程序將令人費解,而且它也不應歸於編程語言。另一些人則認為它是一個很不錯的功能,在任何地方都可以使用。

這兩種觀點既包含正確的成分,但也有欠妥之處。應該承認,運算符重載可能會導致編寫出的程序令人費解,但根據我的經驗,即使不使用運算符重載,也很可能編寫出令人費解的代碼。在某些情況下,不使用重載甚至會使代碼更加令人費解。

那些不分場合、隨意使用重載的人“確實”在生產令人費解的代碼。

在語言中之所以使用重載,是為了在概念上對用戶的類或結構進行簡化。只有在有助於提高用戶所寫代碼的可讀性時,才能對運算符進行重載。請注意,我們所說的檢驗標准是“更清晰”,而不是“更簡短”。運用了運算符重載的類幾乎總是會使代碼變得更簡短,但並不能每次都使代碼變得更清晰(即可讀性更強)。

為了說明這一點,我創建了多個重載示例。您需要仔細閱讀這些代碼,想一想哪個運算符進行了重載,重載的運算符執行了什麼運算。

測驗
1
BigNum n1 = new BigNum("123456789012345");
BigNum n2 = new BigNum("11111");
BigNum sum = n1 + n2;

B
Matrix m1 = loadMatrix();
Matrix m2 = loadMatrix();
Matrix result = m1 * m2;

iii
DBRow row = query.Execute();
while (!row.Done)
{
Viewer.Add(row);
row++;
}

IV
Account current = findAccount(idNum);
current += 5;

答案和討論
1
本示例中,要執行的運算是顯而易見的。這種加法只不過是將預定義的類型相加,每個人都明白執行了什麼運算,因此在這個示例中,使用運算符重載很有意義。

B
本示例演示了矩陣如何相乘。從概念上來說,矩陣乘法與常規乘法不完全類似,但它是一個明確定義的運算,因此任何理解矩陣乘法的人看到這種重載的運算符時,都不會感到驚訝。

iii
本示例中,增量 (++) 運算符進行了重載,它使數據庫行向前移至下一行。任何與數據庫行有關的事物都不可能使我們理解這種增量的真正含義,而且,這種增量要執行的運算也不是那麼明顯。

在這一示例中,重載的使用也沒有使代碼變得更簡單。如果我們轉而使用以下代碼,情況就好多了:

DBRow row = query.Execute();
while (!row.MoveNext())
{
Viewer.Add(row);
}

IV
將事物和雇員相加代表什麼含義呢?本示例中,選擇是一個不錯的方法,將其與雇員數相加就會注冊雇員。這是一種很糟糕的運算符重載用法。

原則
何時進行重載的原則是相當簡單的。如果用戶希望能執行這種運算,那麼就應該進行重載。

重載算術運算符
要重載 C# 中的運算符,指定要執行運算的函數就可以了。函數必須在運算所涉及的類型中進行定義,並且至少有一個參數屬於該類型。這樣可以防止對 int 的加法或其它奇怪事物進行重載。

為了演示重載,我們將開發一個矢量。矢量可以被認為是從原點到特定二維點的線。可以對矢量執行多種運算。以下是該類型的粗略定義:

struct Vector
{
float x;
float y;

public Vector(float x, float y)
{
this.x = x;
this.y = y;
}
}

要實際使用,矢量應支持以下運算:

獲取長度
將矢量乘以某個數字
將矢量除以某個數字
將兩個矢量相加
將一個矢量減去另一個矢量
計算兩個矢量的點積
我們的任務是確定應該如何實現這些運算。

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