上一节:
下一节:

  C# 委托

  • 委托

    C# 委托类似于C或C++中的函数指针。委托是保持参考的方法的参考变量。可以在运行时更改参考。委托特别用于实现事件和回调方法。所有委托都是从System.Delegate类隐式派生的。
  • 声明委托

    委托声明确定委托可以引用的方法。委托可以引用与委托具有相同签名的方法。例如,考虑一个委托-
    
    public delegate int MyDelegate (string s);
    
    前面的委托可用于引用具有单个字符串参数并返回int类型变量的任何方法。委托声明的语法是-
    
    delegate <return type> <delegate-name> <parameter list>
    
  • 实例化委托

    声明委托类型后,必须使用new关键字创建委托对象,并将其与特定方法关联。创建委托时,传递给新表达式的参数与方法调用类似,但不包含方法的参数。例如-
    
    public delegate void printString(string s);
    ...
    printString ps1 = new printString(WriteToScreen);
    printString ps2 = new printString(WriteToFile);
    
    下面的示例演示了声明,实例化和委托的使用,该委托可用于引用采用整数参数并返回整数值的方法。
    
    using System;
    
    delegate int NumberChanger(int n);
    namespace DelegateAppl {
       
       class TestDelegate {
          static int num = 10;
          
          public static int AddNum(int p) {
             num += p;
             return num;
          }
          public static int MultNum(int q) {
             num *= q;
             return num;
          }
          public static int getNum() {
             return num;
          }
          static void Main(string[] args) {
             //create delegate instances
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             
             //calling the methods using the delegate objects
             nc1(25);
             Console.WriteLine("Value of Num: {0}", getNum());
             nc2(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Value of Num: 35
    Value of Num: 175
    
  • 委托的多播

    可以使用“+”运算符来组成对象。组成的委托将调用其组成的两个委托。只能组成相同类型的委托。“-”运算符可用于从组合委托中删除组件委托。使用委托的此属性,您可以创建调用委托时将被调用的方法的调用列表。这称为委托的多播。以下程序演示了委托的多播-
    
    using System;
    
    delegate int NumberChanger(int n);
    namespace DelegateAppl {
       class TestDelegate {
          static int num = 10;
          
          public static int AddNum(int p) {
             num += p;
             return num;
          }
          public static int MultNum(int q) {
             num *= q;
             return num;
          }
          public static int getNum() {
             return num;
          }
          static void Main(string[] args) {
             //create delegate instances
             NumberChanger nc;
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             
             nc = nc1;
             nc += nc2;
             
             //calling multicast
             nc(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Value of Num: 75
    
  • 使用委托

    下面的示例演示了委托的使用。委托printString可用于引用将字符串作为输入且不返回任何内容的方法。我们使用此委托来调用两个方法,第一个方法将字符串打印到控制台,第二个方法将其打印到文件-
    
    using System;
    using System.IO;
    
    namespace DelegateAppl {
    
       class PrintString {
          static FileStream fs;
          static StreamWriter sw;
          
          // delegate declaration
          public delegate void printString(string s);
    
          // this method prints to the console
          public static void WriteToScreen(string str) {
             Console.WriteLine("The String is: {0}", str);
          }
          
          //this method prints to a file
          public static void WriteToFile(string s) {
             fs = new FileStream("c:\\message.txt",
             FileMode.Append, FileAccess.Write);
             sw = new StreamWriter(fs);
             sw.WriteLine(s);
             sw.Flush();
             sw.Close();
             fs.Close();
          }
          
          // this method takes the delegate as parameter and uses it to
          // call the methods as required
          public static void sendString(printString ps) {
             ps("Hello World");
          }
          
          static void Main(string[] args) {
             printString ps1 = new printString(WriteToScreen);
             printString ps2 = new printString(WriteToFile);
             sendString(ps1);
             sendString(ps2);
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    The String is: Hello World
    
上一节:
下一节: