为什么委托声明需要提到标识符?

时间:2017-03-01 08:01:16

标签: c#

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

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

注意:C ++仅支持仅包含类型的声明。由于我来自C ++背景,我期待这里有相同的行为。

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

还存在对方法的命名调用的问题

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

c#允许它,如果你没有名字,你怎么能这样做。

答案 2 :(得分:0)

请注意,我无法找到任何有关此事的官方消息。以下是我的猜测。

首先,拥有参数名称可以让人们轻松了解该参数的作用。如果您只有object而不是object sender,则此参数的重要性非常模糊。如果你在那里放置sender这个词,人们会在第一眼就知道这个参数代表一个事件的发送者。

其次,这使IDE可以轻松为您生成代码。曾经尝试过让Windows Forms Designer为您生成一个事件处理程序吗?它根据委托声明中的参数生成参数名称。如果您没有在声明中输入参数名称,IDE将无法为您生成有意义的名称。

最后,保持这种语法类似于方法声明的语法对编译器开发人员来说可能不那么重要。 :)

答案 3 :(得分:0)

至少有两个很好的理由立即浮现在我的脑海中:

与方法声明的一致性

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

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

此方法的委托可以定义为:

delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

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

开发辅助工具

在Visual Studio中,您可以键入事件名称,然后键入+=,按 Tab 两次,将为您生成事件处理程序方法。委托参数的名称用于生成的方法。如果委托只带有参数类型而不是名称,则参数必须命名为param1param2等,这些都不是很有意义。这同样适用于其他开发辅助工具,例如,当您编写代码来调用委托时,IntelliSense将向您显示委托参数的名称。这比他们的类型更有用。

答案 4 :(得分:-1)

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

想象一下SQLCommand defn

SqlCommand(string, SqlConnection)

VS

SqlCommand(string cmdText, SqlConnection connection)