在 C# 中,委托(Delegate)是一种类型安全的对象,它引用一个或多个方法,并允许你调用这些方法。委托提供了一种方式来引用方法,使得可以将方法作为参数传递给其他方法或存储对方法的引用。以下是关于 C# 委托的基本知识:

定义委托
// 定义一个委托类型
public delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        // 创建委托实例并关联方法
        MyDelegate myDelegate = new MyDelegate(PrintMessage);

        // 调用委托,实际上调用了关联的方法
        myDelegate("Hello, delegates!");
    }

    static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
}

在上述例子中,MyDelegate 是一个委托类型,它可以引用一个参数为 string 类型且返回类型为 void 的方法。PrintMessage 方法与这个委托类型相匹配,所以我们可以将它关联到委托实例上,并通过调用委托来调用方法。

委托的多播
public delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        MyDelegate myDelegate1 = new MyDelegate(PrintMessage1);
        MyDelegate myDelegate2 = new MyDelegate(PrintMessage2);

        // 委托的多播
        MyDelegate multiDelegate = myDelegate1 + myDelegate2;

        // 调用多播委托,实际上调用了关联的所有方法
        multiDelegate("Hello, delegates!");
    }

    static void PrintMessage1(string message)
    {
        Console.WriteLine("Message from PrintMessage1: " + message);
    }

    static void PrintMessage2(string message)
    {
        Console.WriteLine("Message from PrintMessage2: " + message);
    }
}

委托支持多播,即一个委托可以引用多个方法。在这个例子中,multiDelegate 引用了两个不同的方法,调用 multiDelegate 时会依次调用关联的所有方法。

使用内置委托

C# 提供了一些内置的委托类型,例如 Action 和 Func:
class Program
{
    static void Main()
    {
        // 使用 Action 委托
        Action<string> actionDelegate = PrintMessage;
        actionDelegate("Hello, Action!");

        // 使用 Func 委托
        Func<int, int, int> addDelegate = Add;
        int result = addDelegate(3, 5);
        Console.WriteLine("Result from Func: " + result);
    }

    static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }

    static int Add(int a, int b)
    {
        return a + b;
    }
}

Action 委托用于表示没有返回值的方法,而 Func 委托用于表示有返回值的方法。在上述例子中,actionDelegate 引用了一个没有返回值的方法,而 addDelegate 引用了一个有返回值的方法。

委托是 C# 中实现委托和事件模型的基础。它们提供了一种灵活的方式来实现回调、多播以及其他事件驱动的编程模式。


转载请注明出处:http://www.zyzy.cn/article/detail/6365/C#