委托
现在有这样一个问题,对于不同的情况,我们想随机调用不同的函数,因此这时候可以用随机数字的方式去随机。但是这样的方式有点麻烦,对于数据,我们有很多的方式可以去处理,但是如果对于函数,要实现随机的方式,处理起来可能就像下面这样子比较麻烦。
通过去随机数字,然后再根据数字的不同去调用不同的函数。
那有没有另外一种方法呢?能不能将具有相同返回类型和参数类型的函数,使用一种方式来特定的描述起来呢?
如果实现了,那么就可以像容器一般,例如
Class Animal{};
List animList= new List();
换言之就是
我们可以像用下面这种容器的形式去做:
然后问题就是怎么去解决xxx的形式和内容
在C#中提供了这样的语法:
看上图可知,此时GameLevel变成了绿色,变成了一种类型。
即和Class Animal;中的Animal一样,是我们自己定义的一种新类型
此时这个类型就可以用来填在List中,并且LevelA这个返回值和参数都相同的函数,也变成了这种类型的一个实例对象了。
然后此时只需要这样就可以调用:
此时可以正常调用:
以上例子告诉了我们,委托是一种类型
接下来讲解委托的另外一种用法
可以声明一个GameLevel类型的变量,用前面的LevelA来赋值
这两种函数在常规情况下都可以使用
(可以理解为它是指向函数的一个指针?)
于是此时就可以这样用
现在介绍另外一种使用方法:
现在这里有一种奇怪的用法,我们允许修改,但是不允许查看。
这是怎么实现的呢,是因为它允许你传入一个函数,采用这种方式处理内部数据。
上面那个是Manager类,现在我们在另外一个类中使用:
然后可以书写一个函数和过滤器
只有大于200的数才会保留原样 否则销毁
在Manager类里添加一个展示函数:
然后这样:
多播委托
:此时执行一次level会执行很多次
(也可以直接+=函数,这样相当于省略的写法,其实)
这两种方式是相同的
用在什么地方?
比如玩家的金钱增加了,然后此时需要触发什么事件,有可能会触发很多事件,此时可以把事件全部挂在上面
再或者例如:
http://www.maomao365.com/?p=21036
这个网站讲到的:
C#中多播委托的简介
多播委托是什么呢?
多播委托主要体现在多播上,就是一个委托上执行多个方法,
c#中提供了多播委托,我们可以在一个委托上注册多个方法,
当调用委托时,则同时执行多个方法
如:
调用一个汽车启动按钮,
则会同时运行点火,自检,充电,空调等等操作
多播委托的应用方法:
当我们实例化一个委托类型后,
我们可以使用加号(+),减号(-) 对委托上的方法进行添加和撤销操作,如下例所示:
using System;
using System.IO;
namespace consoleTest
{
class TestClass
{
public void printInfo1()
{
Console.WriteLine("汽车启动");
}
public void printInfo2()
{
Console.WriteLine("电路自检");
}
public void printInfo3()
{
Console.WriteLine("空调启动");
}
}
class Program
{
//定义委托
public delegate void delegateName();
static void Main(string[] args)
{
//实例化委托
delegateName t = new delegateName(new TestClass().printInfo1);
//为委托添加方法
t += new delegateName(new TestClass().printInfo2);
t += new delegateName(new TestClass().printInfo3);
// 调用委托
t();
Console.ReadLine();
}
}
}
Unity中的用法:
1.如果要判断现在场景是从哪个场景切换过来就可以通过下面注册一个回调,获取被切换的场景名称,代码如下
using UnityEngine;
using UnityEngine.SceneManagement;
public class ExampleCode : MonoBehaviour
{
// called zero
void Awake()
{
Debug.Log("Awake");
}
// called first
void OnEnable()
{
Debug.Log("OnEnable called");
SceneManager.sceneLoaded += OnSceneLoaded;
}
// called second
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Debug.Log("OnSceneLoaded: " + scene.name);
Debug.Log(mode);
}
// called third
void Start()
{
Debug.Log("Start");
}
// called when the game is terminated
void OnDisable()
{
Debug.Log("OnDisable");
SceneManager.sceneLoaded -= OnSceneLoaded;
}
}