Проблема делегата C # - какого черта этот код делает? - PullRequest
2 голосов
/ 16 сентября 2009

Может кто-нибудь объяснить мне, что делает следующая строка кода C #?

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

Бит, который действительно поставил меня в тупик - это кусок delegate { } в конце. Для большего контекста, пример из EmployeesListView.xaml.cs в образце ViewInjection, который поставляется с PRISM 2. Полное определение класса показано ниже:

/// <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));
            }
        }
    }
}

Ответы [ 2 ]

16 голосов
/ 16 сентября 2009

Этот бит:

delegate {}

просто создает делегат "no-op" соответствующего типа. Этот делегат затем назначается резервной переменной для события. Это простой способ избежать необходимости делать нулевые проверки при создании события - у вас всегда есть хотя бы один обработчик, который является обработчиком no-op.

Это означает, что этот код может быть простым:

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

Вместо:

EventHandler<DataEventArgs<BusinessEntities.Employee>> handler =EmployeeSelected;
if (handler != null)
{
    handler(this, new DataEventArgs<BusinessEntities.Employee>(selected));
}
0 голосов
/ 16 сентября 2009

Он устанавливает анонимный метод, который в принципе ничего не делает. Почему я не уверен, может быть, чтобы избежать проверки или что-то в этом роде, но я бы посчитал это довольно небрежным.

...