文档:
Delegat
一.解释下delegate:
- 我们平时使用的delegate,是关键字
public delegate int Mydelegate(int x,int y);
- C#编译器,它先自动产生一个派生自System.MulticastDelegate的密封类.
- Delegate类是委托类型(delegate声明)的基类。 但是,只有系统和编译器才能显式从Delegate类或MulticastDelegate类派生。 也不允许从委托类型派生新类型。
二. event关键字
- 关键字
- 事件是一种特殊的多播委托,仅可以从声明事件的类或结构(发布服务器类)中对其进行调用。 如果其他类或结构订阅该事件,则在发布服务器类引发该事件时,将调用其事件处理程序方法。 有关详细信息和代码示例,请参阅事件和委托。
- 需要在该类写个方法给外部调用该事件。外部不能直接调用事件。
public class Man
{
//人的事件(这里用了执行无参数无返回值方法的委托类型)
public event Action Fire;
//封装了事件的类方法
public void Action()
{
if (Fire != null)
{
Console.WriteLine("人开枪了");
//触发事件
Fire();
}
}
}
//鸟
public class Bird
{
public string birdName { get; set; }
//声明一个集合类型的静态字段,用于保存实例化的所有Bird类
public static List<Bird> Birds = new List<Bird>();
//这是鸟类对于开枪的事件处理器
internal static void Fly()
{
for (int i = 0; i < Birds.Count; i++)
{
Console.WriteLine(Birds[i].birdName + "飞走了");
}
}
//每一次实例化都会在构造函数中保存当前实例化的Bird类
public Bird()
{
Birds.Add(this);
}
}
class Program
{
static void Main(string[] args)
{
//实例化对象
Man man = new Man();
//订阅事件,联结两类对象中的事件和事件处理器
man.Fire += Bird.Fly;
//循环生成Bird类
for (int i = 0; i < 5; i++)
{
Bird bird = new Bird();
bird.birdName = "小鸟" + i;
}
//调用封装事件的方法,触发事件
man.Action();
}
}
三. Func<T,TResult> Delegate...
- 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
public delegate TResult Func<in T,out TResult>(T arg);
- 继承Object->Delegate->Func<T,TResult>
四. Action和Action<T>...等:
- 定义:
public delegate void Action();
- 继承Object->Delegate->Action<T>
- 封装了一个方法。并且该方法固定了参数个数,并且没有返回值
- 简化了代码
五. UnityEvent和UnityEvent<T0,T1>...等
- UnityEvent可以在面板中增减监听
- 但如果要有多个参数,并且也能在面板中增减,要继承,比如:
[System.Serializable]
public class MyUnityEvent : UnityEvent<Collider>
{
}
public MyUnityEvent myUnityEvent;
六. UnityAction和UnityAction<T0,T1>...等
- 定义:
public delegate void UnityAction();
- 与Action区别不大,没有参数
- 配合 UnityEvent.AddListener 一起使用
网友评论