6 1 2 1 在 C 中模擬自定義運算子

2021-06-26 15:12:11 字數 1158 閱讀 9315

6.1.2.1 在 c# 中模擬自定義運算子

在 c# 中,雖然可以過載現有的運算子,但是,不能宣告新的運算子。然而,在某種程度上,使用擴充套件方法,可以實現相同的模式。擴充套件方法是 c# 3.0 中的一項新功能,下面我們簡要介紹一下。

擴充套件方法(extension methods)

在 c# 中,每個方法必須被包在類中,處理物件的操作是類宣告的一部分,可以使用點表示法來呼叫方法。擴充套件方法為我們處理物件新增新方法,無需修改原始的類宣告。以前,這可能要通過寫靜態方法才行,就像這樣:

stringutils.reverse(str);

這是非常不現實的,因為,要在某些工具類中找到靜態方法,是相當困難的。c# 3.0 中,我們可以把reverse 實現為擴充套件方法,以這種方式呼叫:

str.reverse();

實現擴充套件方法相當容易,因為,它就是有乙個特別修飾符的普通靜態方法,唯一的區別,是它可以作為例項方法來呼叫,使用點表示法;它仍然是靜態方法,因此,它既不能新增新字段,也不能訪問物件的私有狀態:

static class stringutils

所有擴充套件方法都必須括在非巢狀的靜態類中,且必須是靜態方法;修飾符 this 放在第乙個引數之前,告訴編譯器為它是擴充套件方法。

如果我們把前面示例中字串連線實現為擴充套件方法,得到的語法非常類似於原始的 f# 版本。清單 6.3 顯示了使用標準的靜態方法呼叫和擴充套件方法,寫的同樣**。

清單 6.3 使用擴充套件方法處理字串 (c#)

public static string addline(this stringstr, string next) {

returnstr + "\n>>" + next;

console.writeline(

stringutils.addline(

stringutils.addline("helloworld!", "how are you today"),

"i'mfine!"));

console.writeline("hello world!"

.addline("how are you today")

.addline("i'm fine!"));

純粹根據可讀性就能看出好處:我們能夠寫方法呼叫的順序,與希望出現的順序相同,而不需要指定實現方法的類,也不需要額外的大括號。這是常有的事,語法造成了重要差異。

6 1 2 自定義運算子

6.1.2 自定義運算子 定義自定義的運算子的方式類似於函式,使用 let 繫結。它們可以使用任何字元,可以是通常的 f 數 算符 或者是邏輯運算子 還可以是其他字元 宣告乙個運算子,要把它的名字括在括號中,這是與通常的 let 繫結的唯一區別。使用星號時要小心,因為,用於 f 多行注釋的開始。在這...

6 1 2 自定義運算子

6.1.2 自定義運算子 定義自定義的運算子的方式類似於函式,使用 let 繫結。它們可以使用任何字元,可以是通常的 f 數 算符 或者是邏輯運算子 還可以是其他字元 宣告乙個運算子,要把它的名字括在括號中,這是與通常的 let 繫結的唯一區別。使用星號時要小心,因為,用於 f 多行注釋的開始。在這...

scala自定義運算子

通過隱式轉換來實現自定義運算子 案例 定義運算子 使得num1 num2可以獲取到對偶,兩個元素分別為 的結果和 的結果 當然,這個 運算子在bigint中已經實現了,這裡在int中將其實現一次 當使用int呼叫乙個int中不存在的方法的時候,就會來這個類中尋找該方法 implicit class ...