C#委托问题 - 这段代码的作用是什么?

Ste*_*eve 2 c# delegates c#-3.0

任何人都可以向我解释下面的C#代码行是什么吗?

public event EventHandler<DataEventArgs<BusinessEntities.Employee>> EmployeeSelected = delegate { };
Run Code Online (Sandbox Code Playgroud)

真正让我难以理解的是最后的那delegate { }一块.对于更多上下文,来自PRISM 2附带的ViewInjection示例中的EmployeesListView.xaml.cs的示例.完整的类定义如下所示:

/// <summary>
/// Interaction logic for EmployeesListView.xaml
/// </summary>
public partial class EmployeesListView : UserControl, IEmployeesListView
{
    public EmployeesListView()
    {
        InitializeComponent();
    }

    public ObservableCollection<BusinessEntities.Employee> Model
    {
        get { return this.DataContext as ObservableCollection<BusinessEntities.Employee>; }
        set { this.DataContext = value; }
    }

    public event EventHandler<DataEventArgs<BusinessEntities.Employee>> EmployeeSelected = delegate { };

    private void EmployeesList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count > 0)
        {
            BusinessEntities.Employee selected = e.AddedItems[0] as BusinessEntities.Employee;
            if (selected != null)
            {
                EmployeeSelected(this, new DataEventArgs<BusinessEntities.Employee>(selected));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

这一点:

delegate {}
Run Code Online (Sandbox Code Playgroud)

只需创建一个适当类型的"no-op"委托.然后将该委托分配给事件的后备变量.这是一种避免在引发事件时必须进行空检查的简单方法 - 您始终至少有一个处理程序,即无操作处理程序.

这意味着此代码可以很简单:

EmployeeSelected(this, new DataEventArgs<BusinessEntities.Employee>(selected));
Run Code Online (Sandbox Code Playgroud)

代替:

EventHandler<DataEventArgs<BusinessEntities.Employee>> handler =EmployeeSelected;
if (handler != null)
{
    handler(this, new DataEventArgs<BusinessEntities.Employee>(selected));
}
Run Code Online (Sandbox Code Playgroud)

  • 在我们公司,我们称之为"空代表模式" (3认同)