C# 的委托

C# 中的委托

1. 什么是委托

委托是一个引用类型,它定义一个方法类,可以使得一个方法当作另一个方法的参数传递过去。它储存的不是实际值,而是一个储存在堆中对象的一个引用。而委托的关键子就是 delegate

public delegate void MyDel(int x);

public : 修饰词
delegate : 关键字
void : 返回类型
MyDel : 委托类型名
int x : 签名

这样一个 返回值为 void 型 ,带一个int 参数的委托类型就创建好了。
那么我们创建了一个委托,应该如何使用它呢?首先,我们要创建一个委托对象,委托对象跟创建其他的对象是类似的

int num;
MyDel myDel;

这样就创建了一个委托对象。那我们要如何对它赋值呢?
因为该委托是void型带一个int参数的,所以,我们也要用对应的函数给其赋值,看下面代码

class Test
{
    public void TestDel(int num)
    {
        Console.WriteLine("num = {0}", num);
    }
}

我们就可以直接的对委托 赋值 TestDel
MyDel = TestDel

public delegate void MyDel(int x);
 
class Test
{
    public void TestDel(int num)
    {
        Console.WriteLine("num = {0}", num);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        MyDel myDel;

        // 对委托赋值
        myDel = test.TestDel;
        
        Console.ReadKey();
    }
}

使用 “=” 符号赋值是一种方式,还有一种是 “+=” 符号。 因为委托还有一个功能就是:可以组合使用

当我们想对两个对象里的相同方法进行同时调用时,一般会这样

Test test = new Test();
Test test2 = new Test();
test.TestDel(1);
test2.TestDel(1);

而使用委托方法的话是这样的

MyDel myDel1 = test.TestDel;
MyDel myDel2 = test2.TestDel;
myDel1(1);
myDel2(1);

而这样执行的会比较繁琐,所以我们可以直接用一个委托的类型来执行

Test test = new Test();
Test test2 = new Test();
MyDel myDel;
myDel = test.TestDel;
myDel += test2.TestDel;
myDel(1);

这样以来,我们就可以直接的通过一个委托对象 myDel 来执行调用所有的函数了。其实委托在堆内存中的排布时这样的。(注意:这里如果使用 += 的话,myDel 委托必须不为null,否则会报编译错误。)

请添加图片描述

最后介绍的就是如何执行了。执行委托很简单,直接跟普通的对象调用对象函数一样使用 “()”就可以。

下面是一个完整的执行代码:

public delegate void MyDel(int x);

class Test
{
    public void TestDel(int num)
    {
        Console.WriteLine("Test_num = {0}", num);
    }
}

class Test2
{
    public void TestDel2(int num)
    {
        Console.WriteLine("Test2_num = {0}", num);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        Test2 test2 = new Test2();
        MyDel myDel;
        myDel = test.TestDel;
        myDel += test2.TestDel2;

        myDel(12);

        Console.ReadKey();
    }
}

输出的结果:

Test_num = 12
Test2_num = 12

下面来看一个带返回值的委托

public delegate int MyDel(int x);
class Test
{
    public int TestDel(int num)
    {
        return num + 1;
    }
}

class Test2
{
    public int TestDel2(int num)
    {
        return num + 2;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        Test2 test2 = new Test2();
        MyDel myDel;
        myDel = test.TestDel;
        myDel += test2.TestDel2;

        Console.WriteLine($"return num is {myDel(12)}");

        Console.ReadKey();
    }
}

执行后的结果是:
return num is 14

所以带返回值的委托返回的永远是最后一个函数返回的值。


版权声明:本文为qq_36361527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。