2014-12-03 64 views
0

我見過很多代碼示例實例,它們顯示了使用委託的好處。但是,如果可以將基於委託的代碼示例與對相同過程進行建模但不包含委託的代碼進行比較,則可以更清楚地使用委託的目的。這也將展示編寫應該使用代表的代碼的結果性問題,但不是。演示代理使用情況與不使用情況

將是巨大的,如果有人能在這裏貼上這樣的樣本..

編輯:我不要求徵求意見。我要求提供具體的例子來說明同一問題的兩種不同的解決方案。一個解決方案使用代表而另一個解決方案不使用。

+0

這不是一個全面的情況。有時代表們適合這項工作,有時他們不這樣做。如果你知道何時使用它們,你應該能夠自己想出一個匹配的「反模式」。無論如何:迴應和回答將基於高度意見。 – 2014-12-03 15:17:35

+1

我沒有要求「全押」。我也沒有徵求意見。我問具體情況。這個問題不保證由SO Gestapo逮捕..他顯然沒有什麼更好的辦法比挑剔廢話「違規」 – LastTribunal 2014-12-03 18:42:58

回答

2

好吧,這裏有一個例子,我認爲它可以顯示delegate的適當使用。我們有兩種方法可以做一些共同的事情,但在共同工作中有不同的完成任務的方式。 IntConverter<T> delegate允許他們以完成調用方法特有的任務的方式通過。

如果它對你的問題很重要(我不確定),這個例子演示了需要一個實際的delegate類型(與通用的Func<>類型相對),因爲委託類型本身有一個通用參數。

private delegate int IntConverter<T>(T value); 

public void DoSomething<T>(T value) 
{ 
    DoCoreStuff(value, v => ConvertToIntInOneWay(v)); 
} 

public void DoSomethingElse<T>(T value) 
{ 
    DoCoreStuff(value, v => ConvertToIntInAnotherWay(v)); 
} 

private void DoCoreStuff<T>(T value, IntConverter<T> intConverter) 
{ 
    // Do a bunch of common stuff 
    var intValue = intConverter(value); 
    // Do a bunch of other core stuff, probably with the intValue 
} 

同樣的情況也沒有代理來解決這樣的:

public void DoSomething<T>(T value) 
{ 
    DoFirstLotOfCoreStuff(value); 
    DoSecondLotOfCoreStuff(ConvertToIntInOneWay(v)); 
} 

public void DoSomethingElse<T>(T value) 
{ 
    DoFirstLotOfCoreStuff(value); 
    DoSecondLotOfCoreStuff(ConvertToIntInAnotherWay(v)); 
} 

private void DoFirstLotOfCoreStuff<T>(T value) 
{ 
    // Do a bunch of other core stuff, probably with the intValue 
} 

private void DoSecondLotOfCoreStuff(int intValue) 
{ 
    // Do a bunch of other core stuff, probably with the intValue 
} 

...但是這是因爲在DoSomethingDoSomethingElseduplication的較弱的解決方案現已要求Sequential-coupling - 調用兩個輔助方法。

爲了好玩,這裏是解決同一問題的另一種方式:

public interface IIntConverter<T> 
{ 
    int Convert(T value); 
} 

public void DoSomething<T>(T value) 
{ 
    DoCoreStuff(value, new ConvertToIntInOneWayIntConverter()); 
} 

public void DoSomethingElse<T>(T value) 
{ 
    DoCoreStuff(value, new ConvertToIntInAnotherWayIntConverter()); 
} 

private void DoCoreStuff<T>(T value, IIntConverter<T> intConverter) 
{ 
    // Do a bunch of common stuff 
    var intValue = intConverter.Convert(value); 
    // Do a bunch of other core stuff, probably with the intValue 
} 

...這是一個較弱的解決方案,因爲我們已經發明瞭一個接口和兩個實現,當我們想要做was simple enough做與代表。

+0

你剛纔描述瞭如何使用代表,以及他們什麼時候可以派上用場。 OP想要舉一個例子說明如何在沒有代表的情況下做到這一點,證明你應該已經完成​​了與代表和代表單獨。 – 2014-12-03 15:42:33

+1

好的一點很好,但這個例子肯定表明了這樣一種情況,沒有委託的情況下做這件事,會比代表委員會做得更尷尬。因此,代表。 – 2014-12-03 16:07:01

+0

它的確如此。在我看來(該死!我們去!)。 那麼,那麼,代表一路?對於所有其他可行的替代方案? – 2014-12-03 16:26:52