美文网首页csharp
C#委托与代理

C#委托与代理

作者: 雨落随风 | 来源:发表于2017-06-30 15:52 被阅读69次

使用delegate的好处:

  1. 规则由publisher制定,统一,适合打框架,有类似c++头文件的好处。 而传统程序规则为 subscriber制定,分散。
  2. 如果是个人开发,publisher是逻辑主类,subscriber是处理具体功能得类
  3. 如果是团队开发,publisher是主程,subscriber是 各个程序
  4. 如果是跨公司开发,publisher是SDK,subscriber是 使用SDK的程序

函数签名的概念:###

函数签名:参数和返回值 的格式 组成函数签名
void AAA(string a)
void BBB(string name)
Tips:如上所示,AAA和BBB均无返回值,且参数均为string类型,故我们说AAA和BBB具有相同的函数签名。

Delegate

Delegate实际就是对 相同函数签名 的函数的使用。相当于c++里的函数指针。

使用方法:###

第一步:定义 Delegate,也就是签名格式。
第二步:创建Delegate的对象,并添加符合签名的具体函数。
第三步:使用Delegate对象

如果delegate对象 和 具体函数 在不同类里的话,那么就构成了__ sender- reciever__ 或者说publisher - subscriber模型。
其中delegatedelegate承载的handler (handler可以是任何相同函数签名的函数,在函数名后在Handler后缀只是为了好区分)。
而参数可以专门封装在一个继承EventArgs的类里,也可以使用Hashtable.
如果delegate对象前面不加event的话。那么该对象实际是一个参数。
而加event的唯一目的是 让该代理既可以加处理函数,又封装在类里
命名一般是 代表是xxxDelegate 处理函数xxxHandler。

示例:###

示例一:单独delegate ↓↓

//**************************************************************************
//Delegate:单独delegate
//**************************************************************************
using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour {
public delegate void PrintGMDelegate(string name);
public void PrintCN(string name)
{
   print("你好,世界: "+name);
}
public void PrintEN(string name)
{
   print("Good morning, "+name);
}
public void PrintDelegate(string name,PrintGMDelegate Make)
{
   Make(name);
}

void Start ()
{
   PrintGMDelegate dele1;
   dele1 = PrintCN;
   dele1 += PrintEN;
   dele1 -= PrintCN;
//PrintDelegate("Jackie",dele1);
   dele1("Jackie");
}
}

示例二: Sender - receiver模型 ↓↓

//**************************************************************************
//Delegate: Sender - receiver模型
//**************************************************************************
using UnityEngine;
using System.Collections;

public delegate void Pt();
public class Sender
{
public event Pt apt;
public void DO()
{
   apt();
}
}

public class Receiver{
public void Receiving()
{
   Debug.Log("i got it");
}
}

public class TestDelegate : MonoBehaviour {
public void Start()
{
   Sender sender = new Sender();
   Receiver receiver = new Receiver();
   sender.apt += receiver.Receiving;
   sender.DO();
}
}

示例三: Sender - receiver + EventArgs模型

 //**************************************************************************
//
//Delegate: Sender - receiver + EventArgs模型
//
//**************************************************************************
using UnityEngine;
using System.Collections;
using System;

public delegate void PtHandler(MyArgs e);
public class Sender
{
public PtHandler apt;
public void DO(MyArgs e)
{
    apt(e);
}
}

public class MyArgs:EventArgs
{
public int num;
public MyArgs(int tmp)
{
    num = tmp;
}
}

public class Receiver
{
public void Receiving(MyArgs e)
{
    Debug.Log("i got number: "+e.num);
}
}

public class TestDelegate : MonoBehaviour {
public void Start()
{
    Sender sender = new Sender();
    Receiver receiver = new Receiver();
    MyArgs e = new MyArgs(10);
    sender.apt += receiver.Receiving;
    // sender.DO(e);
    sender.apt(e);
}
}
 

示例四: Sender - receiver + Hashtable 没有参数的限制 ↓↓

//**************************************************************************
//
//Delegate: Sender - receiver + Hashtable 
//任意数量的参数,只有返回值格式的限制,没有参数的限制
//
//**************************************************************************
using UnityEngine;
using System.Collections;
using System;

public delegate void PtHandler(Hashtable e);
public class Sender
{
public PtHandler apt;
public void DO(Hashtable e)
{
    apt(e);
}
}


public class Receiver
{
public void Receiving(Hashtable e)
{
    Debug.Log("i got number: "+e["num"]);
}
}

public class TestDelegate : MonoBehaviour {
public GameObject obj;
public void Start()
{
    Sender sender = new Sender();
    Receiver receiver = new Receiver();
    sender.apt += receiver.Receiving;
    Hashtable tab = new Hashtable();
    tab["num"] =101;
    sender.apt(tab);
}
}

转载自风宇冲Unity3D教程学院

相关文章

  • C#委托与代理

    使用delegate的好处: 规则由publisher制定,统一,适合打框架,有类似c++头文件的好处。 而传统...

  • C#中的Action<>和Func<>的

    用过C#的委托的同学都是这Action<> 和 Func<>都是委托【代理】的简写形式!!! 我们先看看定义委托和...

  • 2020-02-19

    C# 委托 (一)—— 委托、 泛型委托与Lambda表达式 原创wnvalentin 最后发布于2018-08-...

  • C#——委托与事件系列一

    本来应该学习泛型与委托的,但是发现C#这里还没有系统的记录过委托与事件,所以先打算把委托与事件补上再继续泛型与委托...

  • C#匿名方法、Lambda表达式和各种泛型委托

    Linq查询与高级C#编程机器理论研究基础 C#委托解决的是对象之间的逆向传递问题,其次,委托还有其他的用途(匿名...

  • 委托与代理

    通知 第一个页面1.注册通知 -(void)justDoIt:(NSNotification *)obj{NSDi...

  • Kotlin | 委托(Delegation)详解

    本文要点概述 辨析委托模式与代理模式 接口委托(Delegated interface) 属性委托(Delegat...

  • Java动态代理

    Java动态代理介绍 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托...

  • Java 动态代理(JDK 和 cglib)[转]

    原文 代理模式 代理模式是常用的 Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类...

  • C# 委托

    C#委托 C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的...

网友评论

    本文标题:C#委托与代理

    本文链接:https://www.haomeiwen.com/subject/ldficxtx.html