萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

.NET 委派入門:建立型別安全的方法參考

.NET 委派 是型別安全的方法參考,封裝具有特定簽名與回傳型別的方法。類似現實世界的「委託遞送」:您決定「做什麼事」(遞送產品)、「參數是什麼」(客戶地址)、「回傳什麼」(付款),實際執行時再指派具體承辦單位 (FedEx/UPS)。

委派基本語法

// 定義委派型別:接受兩個 Object,回傳 Comparison 列舉
public delegate Comparison WhichIsSmaller(object obj1, object obj2);

// 列舉定義比較結果
public enum Comparison { TheFirst = 1, TheSecond = 2 }
  • public:公開存取範圍。
  • delegate:宣告委派而非方法。
  • Comparison:回傳型別,此處為自訂列舉。
  • WhichIsSmaller:委派名稱。
  • 參數清單:(object obj1, object obj2) 定義可封裝方法的簽名。

實務範例:通用排序邏輯與型別專屬比較分離

1. 定義通用 Pair 類別

public class Pair {
    private object[] thePair = new object[2];
    public Pair(object first, object second) { thePair[0]=first; thePair[1]=second; }
    
    // 排序方法接受委派參數
    public void Sort(WhichIsSmaller comparer) {
        if (comparer(thePair[0], thePair[1]) == Comparison.TheSecond) {
            object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp;
        }
    }
    public void ReverseSort(WhichIsSmaller comparer) {
        if (comparer(thePair[0], thePair[1]) == Comparison.TheFirst) {
            object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp;
        }
    }
}

2. 型別實作專屬比較邏輯

// Student 依姓名字母序比較
public class Student {
    public string Name { get; private set; }
    public Student(string name) { Name = name; }
    public static Comparison WhichStudentIsSmaller(object o1, object o2) {
        Student s1 = (Student)o1, s2 = (Student)o2;
        return string.Compare(s1.Name, s2.Name) < 0 ? Comparison.TheFirst : Comparison.TheSecond;
    }
}

// Dog 依體重比較
public class Dog {
    public int Weight { get; private set; }
    public Dog(int weight) { Weight = weight; }
    public static Comparison WhichDogIsSmaller(object o1, object o2) {
        Dog d1 = (Dog)o1, d2 = (Dog)o2;
        return d1.Weight < d2.Weight ? Comparison.TheFirst : Comparison.TheSecond;
    }
}

3. 實例化委派並呼叫排序

// Student 排序
var studentPair = new Pair(new Student("Jesse"), new Student("Stacey"));
var studentComparer = new Pair.WhichIsSmaller(Student.WhichStudentIsSmaller);
studentPair.Sort(studentComparer);  // Jesse 排在前面

// Dog 排序
var dogPair = new Pair(new Dog(65), new Dog(12));
var dogComparer = new Pair.WhichIsSmaller(Dog.WhichDogIsSmaller);
dogPair.Sort(dogComparer);  // 12kg 排在前面

委派進階特性

實例方法 vs 靜態方法

  • 靜態方法:new Delegate(Type.Method),無需實例,效率較高。
  • 實例方法:new Delegate(instance.Method),需實例存在,可存取實例狀態,重複調用較高效(無需重複傳遞 this)。

多播委派

WhichIsSmaller multi = studentComparer + dogComparer; // 鏈結多個方法
multi += AnotherMethod;  // 繼續鏈結
multi -= studentComparer; // 移除

依序調用鏈結清單中所有方法,最後一個方法的回傳值為整體回傳值。

匿名方法與 Lambda (C# 2.0/3.0+)

// C# 2.0 匿名方法
Sort(delegate(object a, object b) { return Comparison.TheFirst; });

// C# 3.0+ Lambda
Sort((a, b) => Comparison.TheFirst);

型別安全優勢

  • 編譯期檢查參數型別與數量、回傳型別相容性。
  • 避免反射調用的執行期錯誤與效能損耗。
  • IntelliSense 完整支援,提升開發效率與程式碼可維護性。

委派是 .NET 事件模型、非同步程式設計、LINQ、泛型委派 (Func<T, TResult>/Action<T>) 等現代語言特性的基石,掌握其核心概念對 .NET 開發至關重要。

copyright © 萬盛學電腦網 all rights reserved