委託、Lambda表示式、事件系列02,什麼時候該用委託

Darren Ji發表於2014-10-01

假設要找出整型集合中小於5的數。

        static void Main(string[] args)
        {
            IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11};
            var result = GetNumbersLessThanFive(source);
            foreach (int n in result)
            {
                Console.WriteLine(n);
            }
        }
        static IEnumerable<int> GetNumbersLessThanFive(IEnumerable<int> numbers)
        {
            foreach (int number in numbers)
            {
                if (number < 5) yield return number;
            }
        }

 

如果要找出整型集合中小於10的數,可能首先想到的是增加一個方法。

        static IEnumerable<int> GetNumbersLessThanTen(IEnumerable<int> numbers)
        {
            foreach (int number in numbers)
            {
                if (number < 10) yield return number;
            }
        }

 

其實,GetNumbersLessThanFive方法和GetNumbersLessThanTen方法簡直太像了,就if語句不一樣。雖然if語句不一樣,但邏輯是一樣的:輸入一個整型數,輸出bool型別。這正是委託該登場的時候!

 

先宣告一個委託,接收int型別引數,返回bool值。現在,if語句可以用委託來替代了,因為委託引數列表和返回型別與if語句吻合。

    internal delegate bool MyCalculateDelegate(int val);
    class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11};
            MyCalculateDelegate del = LessThanFive;
            var result = GetNumbers(source,del);
            foreach (int n in result)
            {
                Console.WriteLine(n); 
            }
        }
        static IEnumerable<int> GetNumbers(IEnumerable<int> numbers, MyCalculateDelegate del)
        {
            foreach (int number in numbers)
            {
                if (del(number)) yield return number;
            }
        }
        static bool LessThanFive(int val)
        {
            return val < 5;
        }
        static bool LessThanTen(int val)
        {
            return val < 10;
        }
    }

可見,當多個方法有重複的部分,且輸入型別一致,返回型別一致,就可以考慮使用委託了。   

 

“委託、Lambda表示式、事件系列”包括:

委託、Lambda表示式、事件系列01,委託是什麼,委託的基本用法,委託的Method和Target屬性

委託、Lambda表示式、事件系列02,什麼時候該用委託

委託、Lambda表示式、事件系列03,從委託到Lamda表示式

委託、Lambda表示式、事件系列04,委託鏈是怎樣形成的, 多播委託, 呼叫委託鏈方法,委託鏈異常處理

委託、Lambda表示式、事件系列05,Action委託與閉包

委託、Lambda表示式、事件系列06,使用Action實現觀察者模式,體驗委託和事件的區別

委託、Lambda表示式、事件系列07,使用EventHandler委託

相關文章