委托,匿名方法,Lambda 表达式 的关系

  1. 相关概念:
  2. 如何使用:
  3. 三者间的关系:

相关概念:
 什么是委托?
    关于委托是什么及如何使用,网上及博客园里有很多相关介绍, 这里我不再赘述。委托是一种引用方法的类型(MSDN)。
 什么是匿名方法?
    我理解为是委托的一种实现方式,也是一种匿名函数。区别于正式签名方法,匿名方法不必创建单独的方法,减少了实例化委托所需的编码系统开销(MSDN)。
 什么是 Lambda 表达式:
    其实质上是一个匿名函数(MSDN

如何使用:
    相关使用方法已在相关 MSDN 上有介绍,这里我贴一段 冒泡排序算法的实现代码,相关使用方法在注释里()。
冒泡排序
        //声明委托 
        delegate string getText(int[] arr);
        
private void dowork() {

            
//使用匿名方法
            getText toString = delegate(int[] arr)
            {
                
string result = "";
                
//int temp = 0;
                foreach (var i in arr)
                {
                    result 
+= string.Format("{0} ,", i);
                }
                
return result;
            };

            
// lambda 表达式 
            getText Sort = (int[] arr) => {
                
string result = "";
                
for (int i = 1; i < arr.Length; i++) {
                    
if (arr[i - 1> arr[i])
                    {
                        
int temp = arr[i-1];
                        arr[i 
- 1= arr[i];
                        arr[i] 
= temp;
                    }
                }
                
//使用匿名方法 
                result = toString(arr);
                
return result;
            };
            
            
int[] arrInt = { 2186712 };
            
string text = toString(arrInt) + "\r\n" + Sort(arrInt); ;
            tbdebug.Text 
+= text;
        }




三者之间的关系:
从相关概念及使用方法上我们可以看出:匿名方法, Lambda表达式 都是匿名函数,均可作为委托的一种实现方式。


------------------------------ 分割线 2010-6-29  ------------------------------
补充:在 .net 2.0 中及以后出现了 System.Action 和 System.Func 两个委托,可以部分地替代我们需要显式声明委托。两者用法相似,但其区别是: Action 不需要返回值, Func 则需要返回指定的类型值。
如:
  public static void Main()
       {
            Func
<int,int> cal = Square; 
           Console.Write(
"the result of {0} is {1}"10, cal(10));

           
/*****  结合 Lambda 表达式 *****/
           Func
<intint> cals = (int s) =>return s+10 ;}
           Console.Write(
"the result of {0} is {1}"10, cals(5));

       }
        
private  static int Square(int size)
       {
            
return size*size;
       }
------------------------------ End 分割线 ------------------------------

posted on 2010-03-09 12:19  感恩的心  阅读(724)  评论(0编辑  收藏  举报

导航