如果您是 C 程式設計師,則可以將委託視為指向函數的指標。然而,C# 中的委託不僅僅是一個簡單的函數指標。本文解釋了委託的概念及其在日常程式設計中的用途。
本質上,委託提供了一定程度的間接性。它們封裝了一段可以以類型安全的方式傳遞和執行的程式碼。它不是立即執行該行為,而是包含在一個物件中。您可以對該物件執行多種操作,其中之一是執行包含的行為。
使用委託允許我們編寫高階函數,也就是可以接收函數作為參數或傳回的函數作為傳回值的函數。委託類型定義委託可以表示的方法簽名,特別是方法的傳回類型及其參數類型。在下面的範例中,Transformer 是一個委託,可以表示任何接受並傳回整數的方法。
delegate int Transformer(int x);
我們可以將任何方法(包括 lambda、實例或靜態方法)指派給滿足簽章的 Transformer 實例。例如 -
Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125
當想要執行某些操作的程式碼不知道這些操作的詳細資訊但知道這些操作的介面時,通常會使用委託。 p>
在程式設計中,我們經常遇到需要執行特定操作的情況,但我們事先不知道要呼叫哪個方法來執行它。委託幫助我們解決這個問題,方法是用委託替換該行為,然後根據上下文和情況的需要傳遞具有適當行為的委託的具體實例。
為了讓委託做任何事情,需要發生四件事 -
委託類型本質上是它所代表的函數的定義,即它由參數組成函數將接受的類型及其返回的返回類型。
例如,代表接受兩個數字作為輸入並傳回數字的方法的委託類型可以宣告為 -
delegate int Processor(int numOne, int numTwo);
處理器是一種類型,類似於由類別建立的類型。要建立此類型的實例,您需要一個接受兩個數字作為輸入並傳回布林值的方法。
2) 要執行的程式碼必須包含在方法中。
定義一個與上述委託類型具有完全相同簽署的方法,並且根據執行時的情況執行您想要的操作。例如,以下任何方法都可用於建立 Processor 實例,因為它們都採用兩個數字並傳回一個數字。
static int Add(int numOne, int numTwo){ Return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ Return numOne - numTwo; }
現在您已經有了委託類型和具有正確簽名的方法,您可以建立該委託類型的實例。這樣做時,我們實質上是告訴 C# 編譯器在呼叫委託實例時執行此方法。
Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract);
上面的範例假設 Add 和 Subtract 方法是在我們建立委託實例的同一類別中定義的。如果這些方法是在不同的類別中定義的,我們將需要該類別的實例。
這只是呼叫一個委託實例上的方法,毫不奇怪地命名為 Invoke。委託實例上的此方法具有與委託類型聲明指定的相同參數清單和傳回類型。呼叫 Invoke 將執行委託實例的操作。
int sum = processorOne.Invoke(3, 5);
但是,C# 讓它變得更容易。您可以直接呼叫委託實例,就像它本身就是一個方法一樣。例如,
int difference = processorTwo(10, 6);
如果我們想透過一次委託實例呼叫來執行一系列不同的操作,C# 允許我們這樣做。系統。委託類型有兩個靜態方法,稱為Combine 和Remove。
建立一個帶有呼叫清單的新委託,該呼叫清單連接作為參數傳遞的委託的呼叫清單。當呼叫新的委託實例時,它的所有操作都會依序執行。
public static Delegate Combine(params Delegate[] delegates); // OR public static Delegate Combine(Delegate a, Delegate b);
如果呼叫清單中的任何操作拋出異常,則會阻止執行任何後續操作。
從另一個委託的呼叫清單中刪除最後一次出現的委託呼叫清單。傳回一個新委託,其中包含透過取得來源呼叫清單並刪除最後一次出現的值呼叫清單而形成的呼叫清單。
public static Delegate Remove(Delegate source, Delegate value);
委託使用特定類型和參數集封裝行為,類似於單一方法介面。
委託類型宣告所描述的型別簽章決定了哪些方法可用於建立委託實例以及呼叫的簽章。
建立委託實例需要我們希望在呼叫委託時執行的方法。
委託實例是不可變的,類似字串。
每個委託實例都包含一個呼叫清單 - 操作清單。
委託實例可以相互組合和刪除。
即時示範
using System; class Program{ delegate int Transformer(int x); delegate int Processor(int numOne, int numTwo); static void Main(){ Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125 Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract); int sum = processorOne.Invoke(3, 5); Console.WriteLine(sum); // prints 8 int difference = processorTwo(10, 6); Console.WriteLine(difference); // prints 4 } static int Add(int numOne, int numTwo){ return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ return numOne - numTwo; } }
9 125 8 4
以上是解釋C#中委託的概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!