当前位置:编程学习 > C#/ASP.NET >>

C#高级程序设计(一)——从接口到代理到匿名方法到lambda表达式

问题背景:使用Sort方法对Product对象进行排序。
下面是Sort方法的两个签名:
[csharp] 
public void Sort(Comparison<T> comparison); 
public void Sort(IComparer<T> comparer); 

其中一个是接收实现了IComparer<T>接口的对象,另一种是接收Comparison<T>代理。
一、使用接口对象
[csharp] 
class ProductNameComparer : IComparer<Product> 

public int Compare(Product x, Product y) 

return x.Name.CompareTo(y.Name); 


... 
List<Product> products = Product.GetSampleProducts(); 
products.Sort(new ProductNameComparer()); 
foreach (Product product in products) 

Console.WriteLine(product); 

二、使用代理
[csharp] 
public int Compare(Product x, Product y) 

    return x.Name.CompareTo(y.Name); 

 
List<Product> products = Product.GetSampleProducts(); 
products.Sort(Compare); 
foreach (Product product in products) 

Console.WriteLine(product.Name); 

思考:接口和代理究竟有怎样的区别和联系?
接口是类/对象的契约,代理是方法的契约;接口对象只能指向实现了接口的类对象,代理对象只能指向实现了方法签名的方法。
三、匿名方法
匿名方法是代理的进一步扩展,它能将代码块传递给代理对象。下面使用匿名方法对上面代码进行改写。
[csharp] 
List<Product> products = Product.GetSampleProducts(); 
products.Sort(delegate(Product x, Product y) 
{ return x.Name.CompareTo(y.Name); } 
); 
foreach (Product product in products) 

Console.WriteLine(product); 

四、lambda表达式
lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托和表达式树类型,下面使用lambda表达式对上面代码进行改写。
[csharp] 
List<Product> products = Product.GetSampleProducts(); 
products.Sort((x, y) => x.Name.CompareTo(y.Name)); 
foreach (Product product in products) 

Console.WriteLine(product); 

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,