c#中操作符重載:
| 代碼如下 |
複製代碼 |
|
class Test
{
public static Test operator + (Test arg1,Test arg2){...}
} |
雖然CLR對操作符一無所知,但它卻規範了程式設計語言應該怎樣提供操作符重載,以使它們可以很容易地被不同的程式設計語言編寫的代碼所使用,每個程式設計語言自己決定是否支援操作符重載,以及如果提供,表達和使用它們的文法是怎樣的,對於CLR來講,操作符重載僅僅是一些方法而已。
當編輯如果代碼時,編輯器會產生一個名為op_Addition的方法定義;該方法定義條目上有一個specialname標記,表示這是一個"特殊"的方法。當編輯器(包括C#編輯器)看到原始碼中的+操作符時,它們會去看其中的運算元類型中有哪一個定義了參數類型和運算元類型相容、名為op_Addition的specialname方法。如果存在這樣的方法,編譯器就會調用方法,如果不存在,則會出現編譯錯誤。
操作符與語言互通性:
操作符重載是一個很有用的工具,它能夠通過簡潔的文法來表達自己的思想。但不是很一種程式設計語言都支援操作符的重載,比如Visual Basic ,所以當Visual Basic開發人員在一相非基元類型(Visual Basic認為的)上應用+操作符時,編譯器將產生一個錯誤,並停止運行。這樣就產生了一個問題,一個使用不支援操作符重載語言的開發人員怎麼去調用另一個支援操作符重載的語言定義類型呢?
以Visual Basic 與 C# 為例(Visual Basic 不支援操作符的重載,而c#支援):
1.在Visual Basic 裡沒有操作符的重載,但是提供了一個op_Addition(相當於+)方法;
首先建一個vb的類庫並建立一個VbType的類,類的內容如下:
| 代碼如下 |
複製代碼 |
|
Public Class VbType
Public Shared Function op_Addition(ByVal a As VbType, ByVal b As VbType) As String
Return "operator + "
End Function
End Class |
2.在 c#裡對上面類型的執行個體進行+操作
| 代碼如下 |
複製代碼 |
|
using System;
class Program
{
static void Main(string[] args)
{
//這樣操作是錯誤的
//不能通過編譯
Console.WriteLine(vb+vb);
//只能通過這樣的方法來訪問
Console.WriteLine(VbType.VbType.op_Addition(vb,vb));
}
} |
之所以不能用+ 來操作兩個執行個體的原因是:當c #編譯器遇到+時,就會到中繼資料中去尋找帶有specialname的中繼資料標記的op_Addition方法,編譯器才能確定這是一個操作符重載的方法,但是vb產生的op_Addition方法沒有specialname標記,所以編譯器會報錯。
相反,如果是在c#中定義了一個+操作符的重載,在vb裡面進行執行個體的+操作的話,也只能調用op_Addition方法