2009-09-16 10 views
2

Quelqu'un peut-il m'expliquer ce que fait la ligne de code C# suivante?C# problème de délégué - que diable ce code fait-il?

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

Le bit qui est vraiment me suis perplexe est la pièce delegate { } à la fin. Pour un peu plus de contexte, l'échantillon des EmployeesListView.xaml.cs dans l'échantillon ViewInjection livré avec PRISM 2. La définition complète de la classe est présentée ci-dessous:

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

Répondre

16

Ce bit:

delegate {} 

crée simplement un délégué "no-op" du type approprié. Ce délégué est ensuite affecté à la variable de support pour l'événement. C'est un moyen simple d'éviter d'avoir à faire des vérifications nuls lors de l'élévation d'un événement - vous avez toujours au moins un gestionnaire, qui est le gestionnaire no-op.

Cela signifie que ce code peut être simple:

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

Au lieu de:

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

Dans notre société, nous appelons cela le "modèle de délégué vide" –

0

Il y a la mise à une méthode anonyme qui ne fondamentalement rien. Pourquoi je ne suis pas sûr, peut-être pour éviter un chèque ou quelque chose, mais je considérerais cela plutôt négligé.

+3

C'est juste le modèle d'objet nul - je ne vois pas pourquoi vous considérez que bâclée. –