官网资料:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/
/// <summary> /// 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用 /// 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。
/// </summary> // Declare a delegate delegate void Del(int i, double j); class MathClass { static void Main() { MathClass m = new MathClass(); // Delegate instantiation using "MultiplyNumbers" Del d = m.MultiplyNumbers; // Invoke the delegate object. Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':"); for (int i = 1; i <= 5; i++) { d(i, 2); } // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } // Declare the associated method. void MultiplyNumbers(int m, double n) { Console.Write(m * n + " "); } }
// Declare a delegate delegate void Del(); class SampleClass { public void InstanceMethod() { Console.WriteLine("A message from the instance method."); } static public void StaticMethod() { Console.WriteLine("A message from the static method."); } } class TestSampleClass { static void Main() { var sc = new SampleClass(); // Map the delegate to the instance method: Del d = sc.InstanceMethod; d(); // Map to the static method: d = SampleClass.StaticMethod; d(); } } /* Output: A message from the instance method. A message from the static method. */
public delegate void Del(string message); class TestDelegate { // Create a method for a delegate. public static void DelegateMethod(string message) { Console.WriteLine(message); } public static void Test() { // Instantiate the delegate. Del handler = DelegateMethod; // Call the delegate. handler("Hello World"); } public static void MethodWithCallback(int param1,int param2,Del callback) { callback("The number is: " + (param1 + param2).ToString()); } }
// Define a custom delegate that has a string parameter and returns void. delegate void CustomDel(string s); class TestClass { // Define two methods that have the same signature as CustomDel. static void Hello(string s) { Console.WriteLine($" Hello, {s}!"); } static void Goodbye(string s) { Console.WriteLine($" Goodbye, {s}!"); } static void Main() { // Declare instances of the custom delegate. CustomDel hiDel, byeDel, multiDel, multiMinusHiDel; // In this example, you can omit the custom delegate if you // want to and use Action<string> instead. //Action<string> hiDel, byeDel, multiDel, multiMinusHiDel; // Create the delegate object hiDel that references the // method Hello. hiDel = Hello; // Create the delegate object byeDel that references the // method Goodbye. byeDel = Goodbye; // The two delegates, hiDel and byeDel, are combined to // form multiDel. multiDel = hiDel + byeDel; // Remove hiDel from the multicast delegate, leaving byeDel, // which calls only the method Goodbye. multiMinusHiDel = multiDel - hiDel; Console.WriteLine("Invoking delegate hiDel:"); hiDel("A"); Console.WriteLine("Invoking delegate byeDel:"); byeDel("B"); Console.WriteLine("Invoking delegate multiDel:"); multiDel("C"); Console.WriteLine("Invoking delegate multiMinusHiDel:"); multiMinusHiDel("D"); } } /* Output: Invoking delegate hiDel: Hello, A! Invoking delegate byeDel: Goodbye, B! Invoking delegate multiDel: Hello, C! Goodbye, C! Invoking delegate multiMinusHiDel: Goodbye, D! */
官网复习一下委托相关概念,记录一下地址