【问题标题】:C# Delegate problem - what the heck does this code do?C# 委托问题 - 这段代码到底做了什么?
【发布时间】:2009-09-16 09:38:02
【问题描述】:

谁能解释一下下面这行 C# 代码的作用?

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

真正让我难过的是最后的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));
            }
        }
    }
}

【问题讨论】:

    标签: c# c#-3.0 delegates


    【解决方案1】:

    这一点:

    delegate {}
    

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

    表示这段代码可以很简单:

    EmployeeSelected(this, new DataEventArgs<BusinessEntities.Employee>(selected));
    

    代替:

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

    【讨论】:

    • 在我们公司,我们将其称为“空委托模式”
    【解决方案2】:

    它将它设置为一个基本上什么都不做的匿名方法。为什么我不确定,也许是为了避免检查或其他什么,但我会认为这很草率。

    【讨论】:

    • 这只是空对象模式——我不明白你为什么认为这很草率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2012-08-29
    • 1970-01-01
    • 2014-03-14
    • 2014-12-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多