标签:多个 函数返回值 函数调用 arp 资料 视频 tor sha 私有
【学习资料】
> 在线文档
官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/
菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html
> 视频教程
腾讯学院、Siki学院
> 书籍
《C#图解教程》(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html
【学习内容】
> 菜鸟教程:高级教程部分(委托、事件)
> 《C#图解教程》:第13~14章
> 委托与事件详解Part1:http://www.tracefact.net/tech/009.html
> 委托与事件详解Part2:http://www.tracefact.net/tech/029.html
【委托Delegate】
// 声明:一个可以指向 返回类型为int,带2个int参数的 函数 public delegate int MyDelegate(int a, int b); // 相加函数 public int AddNum(int a, int b) { return (a + b); } // 相乘函数 public int MultNum(int a, int b) { return (a * b); } void Start() { // 创建:指向不同函数的委托类型 MyDelegate opt = new MyDelegate(AddNum); Debug.Log(opt(2, 5)); // 执行委托函数: 7 // 运行时,可以改变赋值 opt = MultNum; Debug.Log(opt(2, 5)); // 执行委托函数: 10 }
public delegate void MyDelegate(int a, int b); // 输出相加结果 public void PrintAddNum(int a, int b) { Debug.Log("PrintAddNum:" + (a + b)); } // 输出相乘结构 public void PrintMultNum(int a, int b) { Debug.Log("PrintMultNum:" + (a * b)); } void Start() { // 创建:指向不同函数的委托类型 MyDelegate opt = new MyDelegate(PrintAddNum); // 通过+=添加委托函数 // 也可以直接相加 opt = PrintAddNum + PrintMultNum; opt += PrintMultNum; // 执行委托,会按添加的顺序,分别执行PrintAddNum和PrintMultNum opt(2, 5); // 通过-=移除对某函数的引用 opt -= PrintAddNum; // 再次执行委托,只执行了PrintMultNum opt(2, 5); } // 输出 // PrintAddNum: 7 // PrintMultNum: 10 // PrintMultNum: 10
class Person { public delegate void MyDelegate(int a, int b); public MyDelegate myDelegate; // 普通函数,绑定时需要有明确对象(this) public void Func1(int a, int b) { ... } // 静态函数,通过类名.Func2绑定 public static void Func2(int a, int b) { ... } } void Start() { Person myPerson = new Person(); //myPerson.myDelegate += Person.Func1; // 报错,Func1需要对象(this) myPerson.myDelegate += Person.Func2; myPerson.myDelegate += myPerson.Func1; //myPerson.myDelegate += myPerson.Func2; // 报错,Func2是静态函数 }
// 声明委托类型 public delegate void MyDelegate(); class Person { public string name; public void PrintName() { Debug.Log(name); } } void Start() { // 创建2个对象 Person myPerson = new Person(); Person myPerson2 = new Person(); myPerson.name = "Alice"; myPerson2.name = "Bob"; // 创建委托变量 MyDelegate myDelegate = new MyDelegate(myPerson.PrintName); // 多播:委托函数 myDelegate += myPerson2.PrintName; // 执行委托 myDelegate(); } // 输出 // Alice // Bob
【事件】
// 声明委托类型 public delegate void MyDelegate(int a, int b); // 定义事件 public event MyDelegate myEvent;
// 声明委托类型 public delegate void MyDelegate(int a, int b); class Person { // 定义事件 public event MyDelegate myEvent; public void FireEvent(int a, int b) { if (myEvent != null) myEvent(a, b); // 必须在定义事件的类内部执行 } } public void PrintAddNum(int a, int b) { Debug.Log("PrintAddNum:" + (a + b)); } public void PrintMultNum(int a, int b) { Debug.Log("PrintMultNum:" + (a * b)); } void Start() { Person person = new Person(); person.myEvent += PrintAddNum; person.myEvent += PrintMultNum; //person.myEvent(2, 5); // 报错,无法在定义事件的类外部执行 person.FireEvent(2, 5); // 正确 }
public event MyDelegate myEvent { add { ... //执行 += 运算符的代码 } remove { ... //执行 -= 运算符的代码 } }
// 声明委托类型 public delegate void MyDelegate(int a, int b); class Person { // 定义一个私有委托变量 public MyDelegate myDelegate; // 添加 public void AddEvent(MyDelegate d) { myDelegate += d; } // 删除 public void RemoveEvent(MyDelegate d) { myDelegate -= d; } // 执行 public void FireEvent(int a, int b) { if (myDelegate != null) myDelegate(a, b); // 必须在定义事件的类内部执行 } } public void PrintAddNum(int a, int b) { Debug.Log("PrintAddNum:" + (a + b)); } public void PrintMultNum(int a, int b) { Debug.Log("PrintMultNum:" + (a * b)); } void Start() { Person person = new Person(); person.AddEvent(PrintAddNum); // this.PrintAddNum person.RemoveEvent(PrintMultNum); // this.PrintMultNum person.FireEvent(2, 5); }
【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)
标签:多个 函数返回值 函数调用 arp 资料 视频 tor sha 私有
原文地址:https://www.cnblogs.com/shahdza/p/12239296.html