1. 程式人生 > >C#匿名方法和lambda

C#匿名方法和lambda

1.當一個呼叫者想監聽傳進來的事件,他必須定義一個唯一的與相關聯委託簽名匹配的方法,而該方法基本不會被呼叫委託之外的任何程式所呼叫。這裡可以在事件註冊時直接講一個委託與一段程式碼相關聯,這種程式碼成為匿名方法。

示例:

public class MyClass9
    { 
        public EventHandler TestEventHandler ;
        public void Func1()
        {
            TestEventHandler += delegate(object sender, EventArgs e)
            {
                Console.WriteLine("匿名方法");
            };
            TestEventHandler(this, new EventArgs());
        }
    }

2.匿名方法注意事項

匿名方法不能訪問定義方法中的ref或out引數

匿名方法中的本地變數不能與外部方法中的本地變數重名

匿名方法可以訪問外部類作用域中的例項變數(或靜態變數)

匿名方法內的本地變數可以與外部類的成員變數同名(本地變數隱藏外部類的成員變數)

3.C#支援內聯處理事件,通過直接把一段程式碼語句賦值給事件(使用匿名方法),而不是構建底層委託呼叫的獨立方法。Lambda表示式只是用更簡單的方式來寫匿名方法,徹底簡化了對.net委託型別的使用。

4.使用匿名方法示例:

List<T> 的FindAll()方法:

public List<T> FindAll(Predicate<T> match); //該方法的唯一引數為System.Predicate<T>型別的泛型委託。

public delegate bool Predicate<T> (T obj);  //該委託指向任意型別引數作為唯一輸入引數並返回bool的方法。

使用普通:

public class MyClass10
    {
        private void Func1()
        {
            List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };
            Predicate<int> callback = new Predicate<int>(CallBackFunc);
            listInt.FindAll(callback);


        }
        private bool CallBackFunc(int obj)
        {
            if (obj > 3)
            {
                return true;
            }
            return false;
        }
    }

使用匿名方法:

public class MyClass10
    {
        private void Func1()
        {
            List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };          
            listInt.FindAll(
                delegate(int i)
                {
                    if (i > 3)
                        return true;
                    return false;
                });

        }        
    }

使用Lambda:

 public class MyClass10
    {
        private void Func1()
        {
            List<int> listInt = new List<int> { 1, 2, 3, 4, 5, 6 };
            listInt.FindAll(s => s > 3).ToList();  //這裡編譯器可以根據整個Lambda表示式的上下文和底層委託推斷出s是一個整形
        }     
    }

5.多語句Lambda語句塊(使用大括號括起來)

listInt.FindAll(s =>
            {
                Console.WriteLine("aaaaaaa");
                if (s > 3)
                    return true;
                if (s <= 3)
                    return false;
                return true;
            }
            );

6.使用Lambda重寫MyClass9

public class MyClass9
    { 
        public EventHandler TestEventHandler ;
        public void Func1()
        {
            TestEventHandler += (sender, e) =>
            {
                Console.WriteLine("Just Test");
            };

        }
    }