2016-12-02 96 views
1

我想了解「回調模式」。每個答案都說這是由代表(我知道他們)完成的。但在答案的代碼是這樣的:C#代表,爲什麼我們需要它們?

public delegate void Callback(string result); 

public void Test() 
{ 
    CallBack callback = CallbackFunction; 
    DoWork(callback); 
} 

public void DoWork(CallBack callback) 
{ 
    callback("Hello world"); 
} 

public void CallbackFunction(string result) 
{ 
    Console.WriteLine(result); 
} 

我真的不明白,爲什麼我們需要爲此委託?我們也可以這樣做嗎?

public void Test() 
{ 
    DoWork(); 
} 

public void DoWork() 
{ 
    CallbackFunction("Hello world"); 
} 

public void CallbackFunction(string result) 
{ 
    Console.WriteLine(result); 
} 

除此之外,例如在Java中,回調意味着在事件發生後真正的「返回」主程序的「特定功能」。但是當我們使用代表時,這不就是在調用另一種方法嗎?

我們如何進行回調,最終調用OnFail()方法失敗,並且OnSuccess()方法成功。我很困惑。有人可以幫助我理解這一點嗎?

+0

委託是函數模板可以在當前上下文'使用的DoWork '在你的情況。最簡單的例子是事件處理程序。 – Fabio

+0

我知道,但我爲什麼要使用它?特別是回調?它沒有做回調?此外,調用一個方法和它的名稱並調用一個調用方法名稱的委託之間有什麼區別? – Zapdos

+0

已經有幾個答案涵蓋了爲什麼你會使用代表。 http://stackoverflow.com/questions/3567478/delegates-why – Equalsk

回答

0

委託安全地將方法,一種模板封裝到函數的簽名中。有時很容易認爲它是一個函數的指針。

在您的示例中,CallbackFunction可以設置爲Callback,因爲它的定義只需要一個字符串參數。

您可以使用ActionFunc而不是delegate。它們之間的區別在於Action不會返回任何內容,Func可以。對於樣本:

public void Test(Action success, Action<Exception> error) 
{ 
    try 
    { 
     // perform some task 
     success(); 
    } 
    catch (Exception ex) 
    { 
     error(ex); 
    } 
} 

並使用它:

Test(() => { Console.WriteLine("Success"); }, 
    (ex) => { Console.WriteLine($"Error: {ex.Message}"); }); 

Action的通用選項,你可以回教這種方法的參數類型。在示例中,Exception是傳遞給errorAction的一個參數。這同樣適用於Func<>,但最後一種Func是結果類型。

+0

謝謝,但我的主要問題是返回到主類中的一個函數,該函數在其工作之後進行了適當的「回調」。我試圖找到如何使用委託來做這樣的事情。 – Zapdos

0

爲什麼我們需要代表?

因爲在許多程序中,您需要能夠抽象出一個方法的概念。其中一個原因是事件,另一個是一組這樣的方法:

public void DoWork(Action completeCallback) 
{ 
    ... //Do Stuff 
    completeCallback(); 
} 

public void FirstMainMethod() 
{ 
    DoWork(() => Console.WriteLine("First callback"); 
} 

public void SecondMainMethod() 
{ 
    DoWork(() => Console.WriteLine("Second callback"); 
} 

換句話說,我的代碼的不同部分必須在完成不同的方法運行,所以我通過它(我不能使用直接呼叫)。代表抽象允許這樣做。另外請注意,.NET中「完成」回調的想法非常愚蠢,你幾乎不需要需要它。儘管你會一直使用

我們怎樣才能做出一個回調,最終調用失敗時的OnFail()方法和成功的OnSuccess()方法?

你可以很容易地做到這一點。你甚至可以使一個有點一般一個(不知道你是否會永遠想起你,而是下面的代碼工作):

public void SuccessFailHelper(Func<bool> work, Action success, Action failure) 
{ 
    if (work()) 
     success(); 
    else 
     failure(); 
} 
+0

這是迄今爲止內容最豐富的答覆。但我仍然不完全明白。所以我們需要2個代表的2個結果(OnFail和OnSuccess),我會考慮這個並再次寫在這裏。 – Zapdos

+0

@Zapdos是的,如果你想要一個onFail回調和OnSuccess回調,你需要兩個委託「對象」,如果你願意,你不一定需要兩個委託*刪除*(即使用'delegate'關鍵字) – BradleyDotNET

相關問題