2010-10-09 50 views
1

En C# 1. Vous n'avez pas d'options de tri ou de comparaison de délégué. Vous pourriez être forcé de le faire en créant un autre type qui implémente IComparer pour trier vos collections dans ArrayList. Mais à partir de C# 2. Vous pouvez utiliser des délégués pour vos comparaisons. Regardez l'exemple suivant.Délégués/Méthode anonyme en C# 2

List<Product> products = Product.GetSampleProducts(); 
products.sort(delegate(Product p1, Product p2) {return p1.Name.CompareTo(p2.Name);}); 

Je peux voir
1) comment le délégué (méthode anonyme) rend la vie facile
2) la façon dont le code est lisible et comment il m'a aidé à faire la comparaison avec la création en un autre type.

Ma question est - Et si nous voulons utiliser cette comparaison dans plusieurs domaines dans mon application? Ne pensez-vous pas que cela va me forcer à écrire encore et encore la même "méthode anonyme"? Ne pensez-vous pas que cela va à l'encontre de la POO de réutilisation?

Répondre

3

Si vous utilisez la même méthode anonyme encore et encore, il devrait probablement être une méthode statique quelque part. Ensuite, vous passez juste une référence à cela au lieu du délégué. Les délégués anonymes devraient être à titre exceptionnel, peut-être parce qu'ils ont besoin d'une référence aux variables/paramètres de fermeture.

0

Si vous réutilisez un morceau de code fréquemment, refactornez-le dans sa propre méthode.

Comme vous le suggérez, répéter un morceau de code va à l'encontre de la réutilisabilité. Je ne peux pas penser à un modèle qui vous ferait faire ça.

0
Action reusableFunc =() => Console.WriteLine("Hello, world!"); 

quelque part:

reusableFunc(); 

ailleurs:

reusableFunc(); 
0

Quelque chose entre devrait le faire

delegate void MyDelegate(Product p1, Product p2); 

MyDelegate myDelegate = delegate(Product p1, Product p2e) { 
    return p1.Name.CompareTo(p2.Name); 
}; 

products.sort(myDelegate); 
products2.sort(myDelegate);