C#2中的委托/匿名方法

C#2中的委托/匿名方法,c#,asp.net,methods,delegates,anonymous,C#,Asp.net,Methods,Delegates,Anonymous,在C#1中。您没有代理排序或比较选项。您可能会被迫创建另一个类型,该类型实现IComparer以在ArrayList中对集合进行排序。 但从c#2开始。您可以使用代理进行比较。看下面的例子 List<Product> products = Product.GetSampleProducts(); products.sort(delegate(Product p1, Product p2) {return p1.Name.CompareTo(p2.Name);}); List pro

在C#1中。您没有代理排序或比较选项。您可能会被迫创建另一个类型,该类型实现IComparer以在ArrayList中对集合进行排序。 但从c#2开始。您可以使用代理进行比较。看下面的例子

List<Product> products = Product.GetSampleProducts();
products.sort(delegate(Product p1, Product p2) {return p1.Name.CompareTo(p2.Name);});
List products=Product.GetSampleProducts();
products.sort(委托(productp1,productp2){返回p1.Name.CompareTo(p2.Name);});
我能看见
1) 委托(匿名方法)如何让生活变得轻松
2) 代码如何变得可读,以及它如何帮助我在创建其他类型的情况下进行比较

我的问题是-如果我们想在我的应用程序的多个区域中使用此比较,该怎么办?你不认为这会迫使我一次又一次地写同样的“匿名方法”吗?
你不认为这违背了可重用性的OOP吗?

如果你反复使用同一个匿名方法,那么它可能是某个地方的静态方法。然后您只需传递一个对它的引用,而不是委托。匿名委托应该是一次性的,可能是因为它需要对闭包变量/参数的引用。

如果您经常重用一段代码,请将其重构为自己的方法

正如您所建议的,重复一段代码确实不利于可重用性。我想不出一个模式能让你这么做

Action reusableFunc = () => Console.WriteLine("Hello, world!");
某处:

reusableFunc();
其他地方:

reusableFunc();

介于两者之间的东西应该可以做到这一点

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