关于c#:委托不只是速记界面吗?

关于c#:委托不只是速记界面吗?

Are delegates not just shorthand interfaces?

假设我们有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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方法。

代表们简化了一点:

1
2
3
4
5
6
7
8
9
10
11
delegate bool Foo(int x);

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

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

现在,我们可以作为Foo代表在Bar和Baz周围折腾。

除了获得较短的代码外,委托的真正好处是什么?


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

较短,更简洁的代码也是值得的。


从软件工程的角度来看,您是对的,代表与函数接口非常相似,因为它们为函数接口提供了原型。

它们也可以以相同的方式使用:与传递包含所需方法的整个类(而不是传递整个类)相比,您可以仅传递一个委托。这样可以节省大量代码,并创建更具可读性的代码。

而且,随着lambda表达式的出现,现在也可以轻松地对其进行快速定义,这是一个巨大的好处。尽管可以使用C#动态地构建类,但实际上这是一个巨大的难题。

将两者进行比较是一个有趣的概念。从用例和代码结构的角度来看,我以前从未考虑过这些想法有多相似。


从调用者的角度来看,委托与具有单个方法的接口引用确实有很多共同点。

在第一个示例中,Baz和Bar是类,可以继承和实例化。在第二个示例中,Baz和Bar是方法。

您不能将接口引用仅应用于与接口协定匹配的任何类。该类必须显式声明它支持该接口。
您可以将委托引用应用于与签名匹配的任何方法。

您不能在接口协定中包含静态方法。 (尽管您可以将静态方法与扩展方法结合使用)。
您可以使用委托引用来引用静态方法。


可以将委托视为方法的接口,该接口定义方法必须具有什么样的参数和返回类型才能适合委托


您可以将委托作为函数中的参数传递(在技术上,委托在编译时可以成为对象,但这不是重点)。您可以(显然)将一个对象作为参数传递,但是随后您将该类型的对象与该函数绑定为参数。使用委托,您可以传递任何函数以在具有相同签名的代码中执行,而不管其来自何处。


不,委托用于方法指针。然后,可以确保与委托关联的方法的签名正确。

另外,您也无需知道类的结构。这样,您可以使用已编写的方法传递给另一个类中的方法,并定义要实现的功能。

使用Find方法查看List <>类。现在,您需要定义什么来确定某项是否匹配,而无需该类中包含的项实现IListFindable或类似项。


在至少一个向Java中添加闭包(即匿名委托)的建议中,它们等效于具有单个成员方法的接口。


接口和委托是完全不同的两件事,尽管我理解为了易于理解而用类似接口的术语描述委托的诱惑……但是,不了解真相可能会导致混乱。

代表们受到了启发(部分)是由于C ++方法指针的黑色艺术不足以实现某些目的。 一个经典的示例是实现消息传递或事件处理机制。 委托使您可以定义方法签名,而无需了解类的类型或接口-我可以定义一个" void eventHandler(Event * e)"委托,并在实现它的任何类上调用它。

有关此经典问题的一些见解以及为什么希望代表参加,请先阅读此内容,然后再阅读此内容。


是的,可以将委托视为一种方法的接口。


委托是类型化方法指针。与接口相比,它具有更大的灵活性,因为您可以利用协方差和协方差,并且可以修改对象状态(必须将this指针与基于接口的函子一起传递)。

另外,代表有很多不错的语法糖,使您可以轻松地将它们组合在一起。


推荐阅读

    linux转图像界面命令?

    linux转图像界面命令?,系统,密码,电脑,工具,地方,界面,图形界面,软件,终端,

    linux界面网络命令?

    linux界面网络命令?,网络,工作,地址,系统,信息,命令,目录,管理,标准,状态,使

    linux命令行界面向上?

    linux命令行界面向上?,系统,标准,工作,地址,环境,命令,管理,服务,较大,位置,l

    linux炫酷命令界面?

    linux炫酷命令界面?,系统,环境,项目,在线,网络,基础知识,网上,网站,近几年,

    linux命令界面输入法?

    linux命令界面输入法?,系统,工具,信息,第三,软件,输入法,名字,盘后,语言,区

    linux转为命令界面?

    linux转为命令界面?,系统,密码,电脑,软件,界面,图形界面,控制台,终端,命令,

    linux命令行界面汉化?

    linux命令行界面汉化?,系统,标准,软件,网上,管理,工具,电脑,底部,服务,项目,x

    linux界面输入命令?

    linux界面输入命令?,工作,系统,信息,地址,平台,软件,位置,环境,盘中,设计,lin

    linux命令行界面翻页?

    linux命令行界面翻页?,工具,系统,命令,占比,技术,进程,空格键,模式,文件,字

    linux命令界面切换?

    linux命令界面切换?,密码,系统,终端,信息,状态,环境,地方,电脑,工具,命令,lin

    linux命令行交互界面?

    linux命令行交互界面?,系统,密码,状态,终端,信息,工具,环境,情况,首页,界面,l

    linux命令行界面密码?

    linux命令行界面密码?,密码,系统,管理,状态,代码,软件,地址,信息,标的,用户,

    linux命令界面缩小?

    linux命令界面缩小?,系统,工具,网站,数字,等级,地址,缩放,信息,统一,异常,lin

    linux进命令行界面?

    linux进命令行界面?,系统,工具,首页,密码,终端,界面,命令,快捷键,窗口,桌面,l

    linux命令切换到界面?

    linux命令切换到界面?,密码,系统,暂停,状态,终端,工具,地方,环境,信息,数字,

    linux命令行界面输入?

    linux命令行界面输入?,位置,系统,密码,设备,信息,数据,地址,状态,交通,首开,l

    linux开机命令行界面?

    linux开机命令行界面?,系统,数字,首页,终端,密码,发行,工具,地方,界面,命令,

    linux美化命令界面?

    linux美化命令界面?,系统,密码,工具,电脑,界面,终端,地方,官网,设备,管理,Lin

    linux命令切换至界面?

    linux命令切换至界面?,系统,密码,电脑,图形界面,工具,地方,软件,界面,文件,

    linux命令界面放大?

    linux命令界面放大?,系统,工具,地址,信息,状态,软件,等级,虚拟机,分辨率,命