gpt4 book ai didi

c# - 委托(delegate)提问

转载 作者:行者123 更新时间:2023-11-30 16:17:30 27 4
gpt4 key购买 nike

我是 C# 新手,对委托(delegate)两个问题。

MSDN显示 Delegate 类只有两个构造函数,每个构造函数都有两个参数。然而,在下面的程序中,我用一个看似单参数的构造函数实例化了一个 Delegate 对象(参见注释行)。

using System;

static class Program
{
public delegate void MyDelegate();

static void MyMethod()
{
Console.WriteLine("I'm inside MyMethod!");
}

static void Main()
{
MyDelegate myDelegate = new MyDelegate(MyMethod); // Constructor Call
myDelegate();
}
}

我是不是误会了什么?

我的第二个问题是:当用一个或多个参数声明delegate时,为什么我们需要给参数命名?在 C++ 中,我们可以在类中做这样的事情:

public delegate void MyOtherDelegate(int, int, string);

最佳答案

您可能看起来像是在调用标准构造函数,但 C# 编译器实际上对您的代码进行了一些处理。当你写作时

MyDelegate myDelegate = new MyDelegate(MyMethod);

您实际上并没有直接调用 MSDN 上列出的任何构造函数。它改为调用编译器在委托(delegate)类型 MyDelegate 上自动定义的构造函数(MSDN 上未显示这些构造函数)。事实上,MSDN 上列出的构造函数甚至不能直接调用:

This constructor cannot be used in application code. To create a delegate by specifying the name of an instance method, use an overload of the CreateDelegate method…

值得注意的是,为了简洁起见,您甚至可以这样做:

MyDelegate myDelegate = MyMethod;

至于为什么参数名称是必需的,也许它们对于一般的编译来说可能不是严格必需的,但我怀疑CLR的设计者希望在运行时与 的其他特性保持一致。它允许您执行一些您无法通过其他方式执行的操作,例如指定显式参数名称:

Func<int, int> foo = x => x + 1;
foo(arg: 1);

这还意味着您可以通过反射检查参数名称,并可能对它们进行一些有用的处理。

关于c# - 委托(delegate)提问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com