当我们在C#中创建委托时,为了指向具有明确签名(参数集)的函数,它要求我们为每种类型指定标识符。
public delegate void myDelegate(int x, int y);
如果我尝试将此原型声明写为:
public delegate void myDelegate(int, int)
它显示编译时错误identifier expected
。
但据我所知,当我们只是为方法指定原型时,为什么编译器需要一个标识符来区分具有不同签名的两个方法:
public delegate void firstDelegate(int);
和
public delegate void secondDelegate(int, int);
是区分它们的充分而明确的声明。我想是的
我觉得你们有人找到了我?
答案 0 :(得分:8)
它可以在调用点产生影响。例如:
using System;
class Test
{
delegate void Foo(int x, int y);
static void Main()
{
Foo foo = (x, y) => Console.WriteLine("x={0}, y={1}", x, y);
foo(x: 5, y: 10);
foo(y: 10, x: 5);
}
}
两行的输出都是x=5, y=10
,因为参数使用的是名称而不是位置。尽管C#只获得了C#4中的命名参数VB.NET has had them for much longer。
现在它当然没有 那样。 可以的设计是为了让代表首先没有命名参数 - 但是当你调用的所有 else 都有命名参数时,为什么要创建代理?不同?
顺便说一句,你会为接口方法和抽象方法提出相同的建议吗?同样,声明中没有直接使用参数,因为它们只是签名。
请注意,参数名称有助于提高可读性,并允许更容易地记录参数。