Csharp学习记录-委托
委托
委托可以认为是持有一个或多个方法的对象。委托持有一个或多个方法(方法的列表称为调用列表),以及一系列预定义的操作。
委托的声明与创建委托对象
1 2 3
|
delegate void myDelegate(int printNum);
|
1 2 3 4 5
| myDelegate md;
myDelegate md1 = new myDelegate(PrintInt);
|
给委托赋值
委托是引用类型,可以通过给他赋值的方式改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收(和string同理)
1 2 3 4
| myDelegate md1 = new myDelegate(PrintInt); md1 = PrintIntPlusOne;
|
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);
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<int> action = PrintInt;
void PrintInt(int i) { Debug.Log(i); }
Func<int, string> func = IntToString;
string IntToString(int i) { return i.ToString(); }
|