分配是什么意思delegate { }
do?
这只是向事件添加一个匿名函数,其主体为空。从 C#3 开始,人们通常会使用 lambda 表达式来代替:
public event PropertyChangedEventHandler PropertyChanged = (s, e) => { };
然而,lambda 表达式需要导出每个参数,而使用delegate
才不是。因此,如果您不需要使用参数,那么delegate
可能会更简洁。
微软强调这是唯一的剩余用例delegate
定义匿名函数的语法:
当您使用委托运算符时,您可以省略参数列表。如果这样做,创建的匿名方法可以转换为具有任意参数列表的委托类型。这是 lambda 表达式不支持的匿名方法的唯一功能。在所有其他情况下,lambda 表达式是编写内联代码的首选方式。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/delegate-operator https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/delegate-operator
这与评论说该事件是多播有什么关系吗?
不;多播意味着您可以向事件添加多个处理函数,并且当引发事件时,将调用每个处理函数。
例如:
class Example
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaiseEvent()
{
PropertyChanged?.Invoke(default, default);
}
}
var example = new Example();
// Use the += operator to add a new handler (rather than = which overwrites)
example += delegate { Console.Writeline("Handler 1"); };
example += delegate { Console.Writeline("Handler 2"); };
example.RaiseEvent();
// Output:
// Handler 1
// Handler 2
后续问题:为事件分配匿名函数的目的是什么?
如果没有添加处理程序,调用该事件可能会导致NullReferenceException
,因此分配一个空处理程序可以消除处理 null 的必要性。
所以事件可以这样引发:
PropertyChanged.Invoke(default, default);
Or this:
PropertyChanged(default, default);
而不是这个:
PropertyChanged?.Invoke(default, default);