+= operator for Delegate(+= 代表操作符)
问题描述
我知道+=操作符会在Delegate基对象维护的调用列表中添加一个方法,例如
I know that the += operator will add a method to the invocation list maintained by the Delegate base object, for example
using System;
class Program
{
delegate void MyDelegate(int n);
void Foo(int n)
{
Console.WriteLine("n = {0}", n)
}
static void Main(string[] args)
{
MyDelegate d = new MyDelegate(Foo);
d += Foo; // add Foo again
d.Invoke(3); // Foo is invoked twice as Foo appears two times in invocation list
}
}
但是当我查看 MSDN Delegate 时,MulticastDelegate 我找不到 += 运算符.它是如何工作的?自动生成的编译器魔法?
But when I look at MSDN Delegate, MulticastDelegate I can't find any definition of the += operator. How is it that is just works? Auto-generated compiler magic?
推荐答案
在 IL 术语中,它不是委托类型本身的运算符 - 它在语言规范中定义,但您不会使用反射找到它.编译器将其转换为对 Delegate.Combine 的调用.使用 - 或 -= 的反向操作使用 Delegate.Remove.
It's not an operator on the delegate type itself, in IL terms - it's defined in the language specification, but you wouldn't find it using reflection. The compiler turns it into a call to Delegate.Combine. The reverse operation, using - or -=, uses Delegate.Remove.
至少,当 C# 以 .NET 为目标时,它就是这样实现的,几乎总是这样.理论上,这是特定于环境的 - 语言规范不要求编译器使用 Delegate.Combine 或 Delegate.Remove,不同的环境可能没有这些方法.
At least, that's how it's implemented when C# targets .NET, as it almost always does. In theory, this is environment-specific - the language specification doesn't require that a compiler uses Delegate.Combine or Delegate.Remove, and a different environment may not have those methods.
来自 C# 5 规范,第 7.8.4 节(附加):
From the C# 5 specification, section 7.8.4 (addition):
二进制+ 运算符在两个操作数都属于某个委托类型D 时执行委托组合.(如果操作数具有不同的委托类型,则会发生绑定时错误.)如果第一个操作数是 null,则操作的结果是第二个操作数的值(即使那也是 <代码>空).否则,如果第二个操作数为 null,则运算结果为第一个操作数的值.否则,操作的结果是一个新的委托实例,当被调用时,它会调用第一个操作数,然后调用第二个操作数.有关委托组合的示例,请参见 §7.8.5 和 §15.4.由于 System.Delegate 不是委托类型,因此没有为它定义运算符 +.
The binary
+operator performs delegate combination when both operands are of some delegate typeD. (If the operands have different delegate types, a binding-time error occurs.) If the first operand isnull, the result of the operation is the value of the second operand (even if that is alsonull). Otherwise, if the second operand isnull, then the result of the operation is the value of the first operand. Otherwise, the result of the operation is a new delegate instance that, when invoked, invokes the first operand and then invokes the second operand. For examples of delegate combination, see §7.8.5 and §15.4. SinceSystem.Delegateis not a delegate type, operator+is not defined for it.
这篇关于+= 代表操作符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:+= 代表操作符
- C# 中多线程网络服务器的模式 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 输入按键事件处理程序 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
