2014-12-03 101 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