C# 中的方法組
本文將討論 C# 中的方法組。
C# 中的方法組
我們有時會遇到一個函式可能有多個實現的情況。它可能有另一個具有完全不同的引數集或型別的定義,或者通常稱為過載函式。
語法:
void print(int x) {
///...code
}
void print(int x, int y) {
///...code for x and y
}
這樣的函式或方法稱為方法組。
C# 中的 Delegates
DELEGATES
是指向建立的函式的指標。除了指向函式之外,它還定義了函式的返回型別及其引數。
比方說,一個名為 LAPTOP
的委託可以有一個返回型別為 void 和一個引數為 USERNAME
(字串)。我們還有另一個名為 PC
的函式,它也具有與 LAPTOP
相同的返回型別和引數型別。
在這種情況下,我們可以從委託 LAPTOP
呼叫 PC
。
程式碼示例:
delegate void LAPTOP(string username);
static void PC(string username) {
Console.WriteLine("USER: " + username + " has logged in!");
}
static void Main() {
LAPTOP lap1 = PC;
lap1("Hydrogen");
}
你可以注意到我們已經用 PC
例項化了 LAPTOP
例項,稍後呼叫它會導致我們列印從 PC
方法傳遞的使用者名稱。這就是 DELEGATES
的工作方式。
在 C# 中使用 DELEGATE
進行方法組轉換
我們將研究方法組最常見的用途之一,以及在呼叫時如何處理它們。我們討論了方法組如何成為基本方法的過載函式,並且我們可以通過使用 DELEGATES
根據需要使用方法組。
在我們的示例中,假設我們有一個名為 CAR
的方法,我們希望從中處理幾個其他方法,例如 DASHBOARD
、WHEEL
、LIGHTS
等。為方便起見,我們將只使用兩種方法:LIGHTS
和 MIRRORS
。
程式碼示例:
delegate void CAR(bool start);
static void MIRROR(bool start) {
if (start)
Console.WriteLine("Mirror is now working!");
else
Console.WriteLine("Mirror is not stopped/closed");
}
static void LIGHTS(bool start) {
if (start)
Console.WriteLine("Lights are now working!");
else
Console.WriteLine("Lights have stopped/closed");
}
現在我們已經定義了方法,讓我們實現 MAIN
方法,我們使用委託來處理這些方法組。
CAR car = MIRROR;
car(true);
car = LIGHTS;
car(false);
你可以注意到 CAR
物件指向 MIRROR
,但後來它指向 LIGHTS
。然後呼叫該方法呼叫它指向的函式。
函式的名稱被分配給 car
物件。將 DELEGATE
指標更改為指向其組中的不同方法稱為 METHOD GROUP CONVERSION
,在這種情況下,LIGHTS
、MIRRORS
和 CAR
都是同一個方法組的一部分。
C# 中方法組的簡單自定義 Delegate
建立可以指向 METHOD GROUPS
的 DELEGATE
的簡單方法如下所示。
Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());
呼叫上述將輸出字串 AA
作為結果。F_TEST
指向 ToString
方法並呼叫它。
你還可以注意到,此函式指向 ToString
方法的地址,而不是函式本身。這就是指標的工作原理。
下面提供了另一個示例以正確理解方法組。
Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));
語法:
Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to
由於 Convert.ToInt32
的返回型別為 INT
和 18
不同的過載。必須定義引數型別,因為我們想用字串"435"
呼叫 F_TEST
,我們將 PARAM2
定義為 STRING
。
即使只存在一個函式的過載,定義 PARAM2
也很重要;因為 METHOD GROUPS
是編譯時結構,所以必須為單個過載選擇它們。確保 PARAM2
至少包含一個過載是很重要的。
你還可以在函式中呼叫 List.Select(MethodGroup)
時刪除 LINQ
中的強制轉換。我們不會詳細討論 LINQ
上下文,因為本文關注 METHOD GROUPS
。
在 C# 中為方法組使用函式指標
僅當你在 METHOD GROUPS
中工作時,才需要從委託中指向不同的函式。在這種情況下,你必須確保返回型別和引數匹配。
C# 已經提供了一個 FUNC
關鍵字來允許指向不同的函式。就像指標通過指向物件和變數的地址然後呼叫它們來工作一樣,你可以以相同的方式想象委託。
指標也往往具有與其定址的物件相同的返回型別。由於函式的要求,代表還必須處理引數。
假設你想要將函式儲存在陣列中併為你的程式碼動態呼叫它們或將函式傳遞給要呼叫的其他函式時,需要指向函式。LAMBDA
函式也滿足相同的要求。
然而,METHOD GROUPS
是具有遵循基本返回和引數型別的過載函式的常見叢集。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub