委託人就像指向方法的指針。在運行時,有沒有什麼區別調用委託或排除的方法是對象的成員方法:
some.Method();
someDelegate();
代表的目標是創建一個黑箱你想到哪裏一些代碼來放一些行爲,而你只是依靠方法簽名。
在一天結束的時候,他們就像方法接口:
// It must be a parameterless method which returns no value
public delegate void Action();
// vs
// It must be a class which implements a parameterless method "Do"
// which returns no value
public interface Action
{
void Do();
}
也就是說,一個方法不能有條件地與其他切換,但你需要使用常規的控制流像if
或switch
這樣的塊來做出關於做什麼的決定。
爲了不重複喬恩斯基特的答案,我會添加其他可能的解決方案:而不是創建的sampleDelegate
兩個實例
string text = "";
sampleDelegate s1 =() =>
{
if(!string.IsNullOrEmpty(text))
{
SampleMethod1();
}
else
{
SampleMethod2();
}
};
s1();
檢查,您可以創建一個處理條件邏輯致電SampleMethod1
或SampleMethod2
。
整個() => { }
東西叫做匿名代理。
它也可以表述如下:
string text = "";
sampleDelegate s1 = delegate()
{
if(!string.IsNullOrEmpty(text))
{
SampleMethod1();
}
else
{
SampleMethod2();
}
};
但上面的語法不使用......它來自舊.NET天(.NET 1.0/1.1/2.0)。
總之,委託人可以或不可以作爲實際的類方法提供,但您可以將類方法與匿名委託組合起來以滿足您的需求。
如果我只想調用其中一種方法,並且決定在運行時創建 會怎麼樣?我可能會錯過一些非常小的東西,但代表們真的很困惑,不能理解。
其實這是使用委託的原因,但你說得對,當你說你失去了一些東西。
代表用來情況類似下面的一個:
public void DoStuff(string text, Func<string, string> textFormatter = null)
{
Console.WriteLine(textFormatter != null ? textFormatter(text) : text);
}
你可以稱呼DoStuff
要麼這樣DoStuff("hello world")
或DoStuff("hello world", text => $"<strong>{text}</strong>")
。
DoStuff
方法實現不知道如何格式化給定的文本,並且您提供了一個可選參數以將委託作爲參數來接收要格式化的整個文本,並且它將返回格式化文本。
這是不是有點有條件畢竟?根據調用者,DoStuff
以自定義的方式格式化文本。你甚至可以提供一個默認的格式:
public void DoStuff(string text, Func<string, string> textFormatter = null)
{
// We'll give a default formatter if none is provided ;)
if(textFormatter == null)
textFormatter = text => $"<span>{text}</span>";
Console.WriteLine(textFormatter(text));
}
所以你說的是這是不可能使用委託沒有if/else語句或開關的情況下進行選擇來運行特定的方法是什麼? – AnoopDV
@AnoopDV:我不確定你在問什麼。你必須使用條件*某處*,是的...你還希望在多個選項之間進行選擇?這種情況可以用多種方式表達出來...... –