C# Delegate 委托(下)
今天剛好遇到一個委托的問題,寫下來跟大家分享
書上有提到類似的問題所以就把書裡的例子改一改。假如我們今天要做 Bubble sort 但我們想動態改變排序的方式, C++ 而言會傳入 function pointer 而 C# 會使用委託:
using System; namespace DotNetCoreTest { class Program { public delegate bool Comparesion(int first, int second); // sort with different comparesion public static void BubbleSort(ref int[] arr, Comparesion compare) { int tmp = 0; for(int i = 1; i < arr.Length; ++i) { for (int j = 0; j < arr.Length; ++j) { if (compare(arr[i],arr[j])) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } } } // compare method public static bool AscendSort(int a, int b) { if (a < b) return true; else return false; } static void Main(string[] args) { int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; BubbleSort(ref arr, AscendSort); foreach (int num in arr) { System.Console.Write($"{num} "); } System.Console.WriteLine(); } } }
我們把程式做點小修改,下面的程式是一個錯誤的示範:
static void Main(string[] args) { int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; Func<int, int, bool> CompareMethod = AscendSort; BubbleSort(ref arr, CompareMethod); foreach (int num in arr) { System.Console.Write($"{num} "); } System.Console.WriteLine(); }
即便 Function 的結構相通也不能轉換成 Comparesion
最後來個有趣的小問題:
static void Main(string[] args) { int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; Func<int, int, bool> CompareMethod = (int a, int b) => { return a < b; }; BubbleSort(ref arr, CompareMethod); BubbleSort(ref arr, (int a, int b) => { return a < b; }); foreach (int num in arr) { System.Console.Write($"{num} "); } System.Console.WriteLine(); }
看出其中的差異了嗎?
留言
張貼留言