c# - 委托(delegate)不只是简写接口(interface)吗?

标签 c# delegates interface

假设我们有:

interface Foo 
{
 bool Func(int x);
}

class Bar: Foo
{
  bool Func(int x)
  {
   return (x>0);
  }  
}

class Baz: Foo
{
  bool Func(int x)
  {
   return (x<0);
  }  
}

现在我们可以将 Bar 和 Baz 作为 Foos 来回折腾,并调用它们的 Func 方法。

委托(delegate)对此进行了一些简化:

delegate bool Foo(int x);

bool Bar(int x)
{
 return (x<0);
}

bool Baz(int x)
{
 return (x>0);
}

现在我们可以将 Bar 和 Baz 作为 Foo 委托(delegate)来回折腾了。

除了缩短代码之外,委托(delegate)的真正好处是什么?

最佳答案

略有不同,委托(delegate)可以访问它们定义的类的成员变量。在 C# 中(与 Java 不同),所有内部类都被认为是静态的。因此,如果您使用接口(interface)来管理回调,例如按钮的 ActionListener。实现内部类需要传递(通过构造函数)对包含类的部分的引用,它可能需要在回调期间与之交互。委托(delegate)没有此限制,因此减少了实现回调所需的代码量。

更短、更简洁的代码也是一个有值(value)的好处。

关于c# - 委托(delegate)不只是简写接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/95954/

相关文章:

java - 如何在接口(interface)处编写通用方法参数

c# - .NET 中有多少种异步开发模型?

c# - 禁用 asp.net 文本框在启用和更改文本后返回旧值

c# - 获取文件的相对路径 C#

c# - 使用TaskScheduler.UnobservedTaskException可以避免进程被杀死吗?

c# - 什么时候委托(delegate)和 Func/Action 不能互换?

delphi - 将接口(interface)的方法作为参数传递

c# - 我将如何使用委托(delegate)作为参数调用此函数

objective-c - Swift:在 didSet 中通知委托(delegate)?

c# - 在 C# 通用接口(interface)中实现通用 C++/CLI 接口(interface)