[C#基础学习] Delegate 委托

发布时间 2023-06-28 21:12:48作者: Scatter

C++中的指针可以指向对应类型的数据并对其进行操作,但是并没有可以指向某个函数并进行操作的方式。而C#中的delegate就相当于一个指向某个函数的指针,需要时可以直接调用定义的delegate函数来调用对应的函数。

定义方式:

域 delegate [数据类型] 函数名(传参)

基础用法

定义了一个delegate后,仅能将这个函数指向同数据类型、传参一致的函数。

例如如下内容:

public delegate int outNum(int n);
int print(int n)
{
    return n;
}
int sum(int n)
{
    return n + 10;
}
// Start is called before the first frame update
void Start()
{
    outNum out1 = new outNum(print);
    outNum out2 = new outNum(sum);
    Debug.Log("print:"+out1(3));
    Debug.Log("sum:"+out2(3));
}

输出结果为

print:3
sum:13

也可以对delegate函数进行重新定向,如下:

// Start is called before the first frame update
void Start()
{
    outNum out1 = new outNum(print);
    Debug.Log("print:"+out1(3));
    out1 =new outNum(sum);
    Debug.Log("sum:"+out1(3));
}

输出结果仍然为

print:3
sum:13

Multicasting 多播

不同于指针的是,指针做加减法会改变指针指向的地址,从而读取下一位地址的数据。而delegate的加减法则是增加所指向的函数,并按顺序处理。

如下例子:

void Start()
{
    outNum out1 = new outNum(print);
    outNum out2 = new outNum(sum);
    out1 += out2;
    Debug.Log("sum:"+out1(3));
}

输出结果为

sum:13

过程为:先执行out1初始指向的print函数,然后执行out2所指向的函数,因此是队列形式执行先后顺序。