Csharp学习记录-委托

委托

委托可以认为是持有一个或多个方法的对象。委托持有一个或多个方法(方法的列表称为调用列表),以及一系列预定义的操作。

委托的声明与创建委托对象

1
2
3
//委托的声明
//delegate 返回值类型 委托类型名(参数列表)
delegate void myDelegate(int printNum);
1
2
3
4
5
//创建委托对象
myDelegate md;

//带new运算符的对象创建表达式
myDelegate md1 = new myDelegate(PrintInt);

给委托赋值

委托是引用类型,可以通过给他赋值的方式改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收(和string同理)

1
2
3
4
myDelegate md1 = new myDelegate(PrintInt);
md1 = PrintIntPlusOne;

//原有的,调用列表为PrintInt的委托对象不再被引用,将由垃圾回收器回收
  • 为委托添加 / 减去方法
1
2
3
4
5
6
//为委托添加方法: +=运算符
md1 = PrintIntPlusOne;
md1 += PrintInt;

//为委托移除方法: -=运算符
md1 -= PrintIntPlusOne;

如果在调用列表中的方法有多个实例,-=运算符将从列表的最后开始搜索

  • 组合委托
1
2
3
myDelegate md = new myDelegate(PrintIntPlusOne);
myDelegate md1 = new myDelegate(PrintInt);
md1 = md + md1;

调用委托

1
2
3
//像函数一样调用
myDelegate md1 = new myDelegate(PrintInt);
md1(10);

使用参数调用委托,就会使用相同的参数值调用其调用列表的每个成员

调用带返回值的委托

  • 调用列表中最后一个的返回值就是委托返回的值
  • 所有其他方法的返回值都会被忽略

调用带引用参数的委托

  • 如果委托有引用参数,参数的新值会传给下一个方法,依此类推。
1
2
3
4
5
6
7
8
9
10
11
12
13
delegate void myDelegate(ref int printNum);

int temp = 10;

myDelegate md1 = new myDelegate(PrintIntPlusOne);
md1 += PrintIntPlusOne;
md1(ref temp); //打印11,12

void PrintIntPlusOne(ref int i)
{
i = i + 1;
Debug.Log(i);
}

Action和Func

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Action
Action<int> action = PrintInt;

void PrintInt(int i)
{
Debug.Log(i);
}

//Func<T1,T2>:T1为参数,最后的T2为返回值
Func<int, string> func = IntToString;

string IntToString(int i)
{
return i.ToString();
}
  • Action是.Net Framework内置的泛型委托

    1. 参数0~16个
    2. 没有返回值
  • Func是.Net Framework内置的泛型委托

    1. 参数0~16个
    2. 有返回值