猿教程 Logo

C# 委托

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

一个函数可以有一个或多个不同数据类型的参数,但如果你想传递一个函数本身作为参数怎么办? C#如何处理回调函数或事件处理程序? 答案是 - 委托。

一个委托就像一个指向一个函数的指针。 它是一个引用类型数据类型,它保存方法的引用。 所有的委托都隐式地派生自System.Delegate类。

委托可以使用delegate关键字后跟一个函数签名来声明,如下所示。

委托声明语法:

<access modifier> delegate <return type> <delegate_name>(<parameters>)

以下示例声明了一个Print委托。

相关实例:

public delegate void Print(int value);

上面显示的Print委托,可以用来指向任何具有与Print一起声明的相同返回类型和参数的方法。 请参考以下示例,声明并使用Print委托。

相关实例:

class Program
{
    // declare delegate
    public delegate void Print(int value);

    static void Main(string[] args)
    {
        // Print delegate points to PrintNumber
        Print printDel = PrintNumber;
          
        printDel(100000);
        printDel(200);

        // Print delegate points to PrintMoney
        printDel = PrintMoney;

        printDel(10000);
        printDel(200);
    }

    public static void PrintNumber(int num)
    {
        Console.WriteLine("Number: {0,-12:N0}",num);
    }

    public static void PrintMoney(int money)
    {
        Console.WriteLine("Money: {0:C}", money);
    }
}

运行结果:

Number: 10,000 
Number: 200 
Money: $ 10,000.00 
Money: $ 200.00

在上面的例子中,我们声明了Print委托,它接受int类型参数并返回void。 在Main()方法中,声明一个Print类型的变量并赋予一个PrintNumber方法名。 现在,调用Print delegate将依次调用PrintNumber方法。 同样,如果Print委托变量分配给PrintMoney方法,那么它将调用PrintMoney方法。

下图说明了委托。



调用委托

委托可以像方法一样调用,因为它是对方法的引用。 调用委托将调用id所指的方法。 可以通过两种方式调用委托:using()运算符或使用委托的Invoke()方法,如下所示。

相关实例:

Print printDel = PrintNumber;
printDel.Invoke(10000);

//or
printDel (10000);

运行结果:

Number: 200 
Number: 200

将委托作为参数

方法可以具有委托类型的参数,并且可以调用委托参数。

相关实例:

public static void PrintHelper(Print delegateFunc, int numToPrint)
{
    delegateFunc(numToPrint);
}

在上面的例子中,PrintHelper方法具有Print类型的委托参数,并像下面的函数一样调用它:delegateFunc(numToPrint)。

以下示例显示如何使用包含委托类型参数的PrintHelper方法。

相关实例:

class Program
{
    public delegate void Print(int value);


    static void Main(string[] args)
    {
        PrintHelper(PrintNumber, 10000);
        PrintHelper(PrintMoney, 10000);
    }

    public static void PrintHelper(Print delegateFunc, int numToPrint)
    {
        delegateFunc(numToPrint);
    }

    public static void PrintNumber(int num)
    {
        Console.WriteLine("Number: {0,-12:N0}",num);
    }

    public static void PrintMoney(int money)
    {
        Console.WriteLine("Money: {0:C}", money);
    }
}

运行结果:

Number: 10,000 
Money: $ 10,000.00

多播委托(MulticastDelegate)

代理可以指向多个方法。 指向多个方法的委托称为多播委托。 “+”运算符向委托对象添加一个函数,“ - ”运算符从委托对象中删除一个现有函数。

相关实例:

public delegate void Print(int value);

static void Main(string[] args)
{       
    Print printDel = PrintNumber;
    printDel += PrintHexadecimal;
    printDel += PrintMoney;

    printDel(100000);
}
public static void PrintNumber(int num)
{
    Console.WriteLine("Number: {0,-12:N0}",num);
}

public static void PrintMoney(int money)
{
    Console.WriteLine("Money: {0:C}", money);
}

public static void PrintHexadecimal(int dec)
{
    Console.WriteLine("Hexadecimal: {0:X}", dec);
}

运行结果:

Number: 1,00,000 
Hexadecimal: 186A0 
Money: $ 1,00,000.00

从上面的例子可以看出,Print委托成为一个多播委托,因为它指向三个方法 - PrintNumber,PrintMoney和PrintHexadecimal。 所以调用printDel将依次调用所有方法。

代理也用于事件,匿名方法,Func委托,Action委托。


更多资料

何时使用代理而不是接口。

重点
  1. Delegate是一个函数指针。 它是引用类型数据类型。

  2. 语法:public delegate void

  3. 要分配给委托的方法必须与委托具有相同的签名。

  4. 代理可以像普通函数或Invoke()方法那样调用。

  5. 可以使用“+”运算符将多个方法分配给委托。 它被称为多播委托。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/csharp-delegate.html