2017-03-01 71 views
4

当我跳过具有委托类型的标识符时,编译器会抛出错误,说出所需的标识符。所以,在声明委托时,为什么必须指定类型的标识符?在声明权中只有类型信息就足够了?为什么委托声明需要提到标识符?

public delegate void MyDel(object o, EventArgs e); // accepted by compiler 
public delegate void MyDel(object, EventArgs); // throws error, why? 

注意:C++支持只有类型的声明。由于我来自C++背景,我预计这里的行为也是一样。

+3

假设您有一个代表对象和EventArgs的两个对象的委托。你或者其他执行委托的人会如何分辨哪个是哪个? – BoltClock

+0

是否想从接口中声明的方法中删除参数名称,以及抽象方法吗?基本上,参数列表在任何地方都有一致的语法。 –

回答

1

如果没有别的,那么在您编写documentation时,您可以清楚地指出您正在讨论哪些参数。 (例如,对于具有相同类型的多个参数的代表)

它也与其他区域(例如抽象方法或接口方法)一致,但它们也没有主体,但仍需要命名参数。

-1

任何优秀的程序员都将定义参数名称,清楚地指明它们的用途。如果只允许输入,则会导致混淆。这种混淆需要文档和仔细阅读,导致生产力的下降。对于这种语言的设计者决定在定义委托或接口时定义参数名称。

想象的SqlCommand DEFN

SqlCommand(string, SqlConnection) 

VS

SqlCommand(string cmdText, SqlConnection connection) 
0

注意,我找不到任何官方关于这一点。以下是我的猜测。

首先,具有参数名称可以让人们很容易知道该参数的作用。如果你只有object而不是object sender,这个参数的重要性是非常模糊的。如果您在那里输入sender这个词,人们一眼就会知道这个参数代表了一个事件的发送者。其次,这使得IDE为您生成代码变得很容易。曾尝试让Windows窗体设计器为您生成一个事件处理程序?它根据委托声明中的参数生成参数名称。如果不在声明中放入参数名称,则IDE无法为您生成有意义的名称。

最后,保持语法与方法声明类似,对于编译器开发人员来说可能更少。 :)

1

还有一个名为通话的问题的方法

MyDel myDel = MyMethod; 
myDel(o:sender,e: eve); 

C#允许它,如果你没有一个名字,你怎么能做到这一点。

+0

这是一个很好的论点,但它在历史上有点颠倒。代表是第一个(并且他们总是有命名参数),然后来到命名参数。所以你也可以说,如果代表中没有命名参数,引入显式命名参数会更困难。无论如何,+1是值得的。 – Sefe

+0

你是对的可以宣誓它是在同一个版本。 –

0

有立即来到我的脑海里至少有两个很好的理由:

一致性与方法声明

你是正确的,参数名称不是签名的组成部分,因此它在技术上是不需要匹配委托(因此,在将委托与方法匹配时,参数名称将被忽略)。但是,一致性是语言的一个重要特征。它使学习变得更容易,减少认知工作量,从而提高生产力。代表是一种方法的“占位符”。为了保持一致,将其定义尽可能类似于方法定义是有意义的。一种方法会声明如下:

void PropertyChangedHandler(object sender, PropertyChangedEventArgs e) { 
    //... 
} 

授人以这种方法可以像定义:

delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 

正如你所看到的,唯一的区别是delegate关键字(当然缺乏一个方法体,这在这里是不相关的,因为这不是签名的一部分)。这很容易学习和记忆。

发展论坛艾滋病

在Visual Studio中,您可以键入事件名称,然后+=,按Tab键两次,并会为您生成的事件处理方法。代表参数的名称用于生成的方法。如果代表仅带有参数类型而不带名称,则参数必须命名为param1,param2等,这不会很有意义。这同样适用于其他开发辅助工具,例如,当您编写代码调用委托时,智能感知会向您显示委托参数的名称。这比他们的类型更有用。