【发布时间】:2011-01-17 02:21:21
【问题描述】:
我了解委托和事件的工作方式。我也可以想象一些我们应该实现事件的常见场景,但是我很难理解在什么情况下应该使用委托。
感谢
回复用户 KVB 的帖子:
一)
您基本上可以在任何需要使用单一方法接口的地方使用委托。
我想我有点明白以下几点:
类 C 可以定义方法 C.M,该方法将接口 IM 作为参数。这个接口将定义一个方法 IM.A,因此任何想要调用 C.M 的人都需要实现这个接口。
或者,方法 CM 可以将具有相同签名的委托 D (而不是接口 IM )作为参数作为方法 IM.A。
但我不明白的是为什么 CM 也不能使用委托 D 作为其参数,即使我们的界面 IM除了方法 A 之外,还定义了几个其他方法?因此,类 C 的其他方法可能需要接口 IM 作为参数,但 CM 可能需要委托 D(假设 CM 只需要调用方法 A 而不需要调用 IM 中定义的任何其他方法)?
b)
var list = new List<int>(new[] { 1, 2, 3 });
var item = list.Find(i => i % 2 == 0);
上面的代码是用户 jpbochi 调用的示例吗(请参阅她/他在此线程中的帖子)依赖注入?
我假设无法使用事件而不是“纯”委托来实现上述代码?
【问题讨论】:
-
依赖注入允许调用者控制被调用者所做的事情。在典型的方法调用方式中,调用者传入一组参数,然后被调用者执行它认为合适的操作。唯一的交叉点是在方法的开始和结束处(纯粹意义上的)。但是,通过提供委托,被调用者必须有效地询问调用者中间流如何处理情况,在这种情况下,被调用者处理枚举,但调用者必须有效地处理过滤。
-
实际上你总是可以用事件替换委托。理论上,您可以有一个使用过滤器表达式播种的事件,然后在查找查找期间调用。但是,您现在已经为调用者引入了额外的工作,特别是他们必须设置和拆除事件以避免奇怪的行为。更不用说可能的线程问题了。这些可以通过使用委托来避免并且代码更具可读性。而另一方面,事件只是保存的委托,从实现的角度来看,没有什么比这更重要的了。
-
a) "唯一的交叉是在方法的开始和结束处(纯粹意义上的"你所说的交叉是什么意思?b) "在硬币的另一边事件只是保存的委托,从实现的角度来看,没有什么比这更“这是另一件事让我感到困惑 - 我如何决定我是否需要事件的安全性或我是否不需要该安全性,因此应该实现“纯”委托而不是事件?