Vadim Prokopchuk Asked:2020-01-05 04:41:04 +0000 UTC2020-01-05 04:41:04 +0000 UTC 2020-01-05 04:41:04 +0000 UTC C# 代表。调用 772 让我们以下面的代码为例,跳过所有细节。 private void Example(Func<bool> exampleFunction) { bool result = exampleFunction(); // 1 result = exampleFunction.Invoke(); // 2 } 第一次和第二次函数调用有什么区别?描述使用第一次或第二次委托调用很重要的情况。 在 MSDN 上它说: 使用指定参数调用当前实例表示的方法或构造函数。 c# 2 个回答 Voted Best Answer VladD 2020-01-05T05:09:50Z2020-01-05T05:09:50Z 实际上你的对象exampleFunction有类型Func<bool>,它的基类型MulticastDelegate,这个类型有基类型Delegate(http://ideone.com/I99DiH)。 对于类型的后代,DelegateCLR 提供了一个方法Invoke,其签名与委托声明的签名相匹配。来自 MSDN: 公共语言运行时Invoke为每个委托类型提供一个方法,具有与委托相同的签名。您不必从 C#、Visual Basic 或 Visual C++ 中显式调用此方法,因为编译器会自动调用它。当您想查找委托类型的签名时,该方法在反射Invoke中很有用。 这意味着没有区别,通常只用括号调用会更容易。 Invoke一些使用有意义的特定情况: 反射。给定一个委托类型对象,您可以通过Invoke. 新运营商?.:而不是 if (exampleFunction != null) exampleFunction(); 你可以写得更优雅 exampleFunction?.Invoke(); Modus 2020-10-23T06:59:12Z2020-10-23T06:59:12Z Invoke 方法还允许您克服委托的主要缺点 - 不同类型但具有相同签名的委托通过分配不兼容。 EventHandler<CancelEventArgs> handler1 = new EventHandler<CancelEventArgs>(SomeHandler); Action<object, CancelEventArgs> handler2 = handler1; // Так нельзя! handler2 = new Action<object, CancelEventArgs>(handler1.Invoke); // А так можно.
实际上你的对象
exampleFunction有类型Func<bool>,它的基类型MulticastDelegate,这个类型有基类型Delegate(http://ideone.com/I99DiH)。对于类型的后代,
DelegateCLR 提供了一个方法Invoke,其签名与委托声明的签名相匹配。来自 MSDN:这意味着没有区别,通常只用括号调用会更容易。
Invoke一些使用有意义的特定情况:Invoke.新运营商
?.:而不是你可以写得更优雅
Invoke 方法还允许您克服委托的主要缺点 - 不同类型但具有相同签名的委托通过分配不兼容。