我对c#比较陌生,我想知道什么时候应该适当地使用委托。 它们在事件声明中被广泛使用,但是什么时候应该在我自己的代码中使用它们,为什么它们有用?为什么不用别的东西呢?
我也想知道什么时候我必须使用委托,我没有其他的选择。
谢谢你的帮助!
编辑:我认为我在这里找到了委托的必要用途
我对c#比较陌生,我想知道什么时候应该适当地使用委托。 它们在事件声明中被广泛使用,但是什么时候应该在我自己的代码中使用它们,为什么它们有用?为什么不用别的东西呢?
我也想知道什么时候我必须使用委托,我没有其他的选择。
谢谢你的帮助!
编辑:我认为我在这里找到了委托的必要用途
当前回答
当你想要声明你想要传递的代码块时,委托是非常有用的。例如,当使用通用重试机制时。
伪:
function Retry(Delegate func, int numberOfTimes)
try
{
func.Invoke();
}
catch { if(numberOfTimes blabla) func.Invoke(); etc. etc. }
或者当你想要做代码块的后期计算,比如你有一些Transform动作的函数,并且想要有一个BeforeTransform和一个AfterTransform动作,你可以在你的Transform函数中计算,而不需要知道BeginTransform是否被填充,或者它必须转换什么。
当然,在创建事件处理程序时也是如此。您不希望现在计算代码,而只希望在需要时计算代码,因此您可以注册一个可以在事件发生时调用的委托。
其他回答
委托是一个简单的类,用于指向具有特定签名的方法,本质上成为类型安全的函数指针。委托的目的是在一个方法完成后,以结构化的方式方便对另一个(或多个)方法的回调。
虽然可以创建一组大量的代码来执行此功能,但您不需要这样做。你可以使用委托。
创建委托很容易做到。使用"delegate"关键字将类标识为委托。然后指定类型的签名。
Delegates Overview Delegates have the following properties: Delegates are similar to C++ function pointers, but are type safe. Delegates allow methods to be passed as parameters. Delegates can be used to define callback methods. Delegates can be chained together; for example, multiple methods can be called on a single event. Methods don't need to match the delegate signature exactly. For more information, see Covariance and Contra variance. C# version 2.0 introduces the concept of Anonymous Methods, which permit code blocks to be passed as parameters in place of a separately defined method.
我同意已经说过的一切,只是试着用另一种说法来解释。
委托可以被视为一个或多个方法的占位符。
通过定义委托,您就在对类的用户说:“请随意将与此签名匹配的任何方法分配给委托,并且每次调用我的委托时都会调用它”。
典型的使用当然是事件。所有的OnEventX委托给用户定义的方法。
委托非常有用,可以为对象的用户提供一些自定义行为的能力。 大多数时候,你可以使用其他方法来达到同样的目的,我不相信你会被强迫创建委托。在某些情况下,这是完成任务最简单的方法。
当你想要声明你想要传递的代码块时,委托是非常有用的。例如,当使用通用重试机制时。
伪:
function Retry(Delegate func, int numberOfTimes)
try
{
func.Invoke();
}
catch { if(numberOfTimes blabla) func.Invoke(); etc. etc. }
或者当你想要做代码块的后期计算,比如你有一些Transform动作的函数,并且想要有一个BeforeTransform和一个AfterTransform动作,你可以在你的Transform函数中计算,而不需要知道BeginTransform是否被填充,或者它必须转换什么。
当然,在创建事件处理程序时也是如此。您不希望现在计算代码,而只希望在需要时计算代码,因此您可以注册一个可以在事件发生时调用的委托。
我认为委托是匿名接口。在许多情况下,只要需要带有单个方法的接口,就可以使用它们,但不希望定义该接口的开销。