精华内容
下载资源
问答
  • delegate用法

    2015-06-29 11:34:00
    一般来说 delegate 可以申明一个delegate类型 比如 public delegate funa(object b) 然后使用的时候申明 funa 作为类型 new funa(回调函数) 在遍历一个集合的时候,可能我们集合内部是一个类或者结构体类型,而...

    一般来说 delegate 可以申明一个delegate类型  比如 public delegate funa(object b)

    然后使用的时候申明 funa 作为类型  new funa(回调函数)   

     

    在遍历一个集合的时候,可能我们集合内部是一个类或者结构体类型,而给定的值是类中的一个成员变量值 ,那么我们可以使用 list.find(delegate(class a){return a.id==id;});

    或者省区delegate list.find((class a)=>{return a.id==id}) 都是可行的。这是对集合写法优化

    一般的思考是遍历集合进行对比

    foreach(class a in list)

    {

    if(a.id==id)

    {

    return a;}

    }

    转载于:https://www.cnblogs.com/wility/p/4607112.html

    展开全文
  • delegate 用法

    千次阅读 2014-05-29 13:16:41
    Delegate是一种应用composite来代替extend的机制,可以有效地降低代码的耦合性。 Rails 2.2增加了delegate方法,可以十分方便地实现delegate机制。来看看源码吧: 01.def delegate(*methods) 02...

    Delegate是一种应用composite来代替extend的机制,可以有效地降低代码的耦合性。

    Rails 2.2增加了delegate方法,可以十分方便地实现delegate机制。来看看源码吧:

    def delegate(*methods)  
      options = methods.pop  
      unless options.is_a?(Hash) && to = options[:to]  
        raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
      end
       
      if options[:prefix] == true && options[:to].to_s =~ /^[^a-z_]/  
        raise ArgumentError, "Can only automatically set the delegation prefix when delegating to a method."
      end
       
      prefix = options[:prefix] && "#{options[:prefix] == true ? to : options[:prefix]}_"
      
      methods.each do |method|  
        module_eval(<<-EOS, "(__DELEGATION__)", 1)  
          def #{prefix}#{method}(*args, &block)  
            #{to}.__send__(#{method.inspect}, *args, &block)  
          end
        EOS
      end
    end


    delegate方法首先检查传入的参数,正确参数形式为:method1, :method2, ..., :methodN, :to => klass[, :prefix => prefix]

    delegate要求参数的最后必须是一个Hash,:to表示需要代理的类,:prefix表示代理的方法是否要加前缀,如果:prefix => true,则代理的方法名为klass_method1, klass_method2, ..., klass_methodN,如果:prefix => prefix (prefix为string),则代理的方法名为prefix_method1, prefix_method2, ..., prefix_methodN。

    最终通过module_eval动态生成每个方法定义。通过__send__方法调用:to类的方法。

    来看看调用的例子:

    简单的调用:

    class Greeter < ActiveRecord::Base  
      def hello()   "hello" end
      def goodbye() "goodbye" end
    end
       
    class Foo < ActiveRecord::Base  
      delegate :hello, :goodbye, :to => :greeter
    end
       
    Foo.new.hello   # => "hello"  
    Foo.new.goodbye # => "goodbye"  

    增加:prefix => true:

    class Foo < ActiveRecord::Base  
      delegate :hello, :goodbye, :to => :greeter, :prefix => true
    end
       
    Foo.new.greeter_hello   # => "hello"  
    Foo.new.greeter_goodbye # => "goodbye"  

    自定义前缀名:

    class Foo < ActiveRecord::Base  
      delegate :hello, :goodbye, :to => :greeter, :prefix => :foo
    end
      
    Foo.new.foo_hello   # => "hello"  
    Foo.new.foo_goodbye # => "goodbye" 


    展开全文
  • Unity 项目中委托Delegate用法案例

    千次阅读 2018-05-21 00:00:19
    Unity 项目中委托Delegate用法案例 Unity中Delegate的用法场景 Chinar - 本文提供全流程,中文翻译。助力快速理解 C# Delegate的基本用法 Unity 中,委托多用于当某个值,或者物体状态发生改变的时候 其他一些操作...

    Unity中Delegate的用法场景


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



    Chinar —— 心分享、心创新!

    助力快速理解 C# Delegate的基本用法

    为新手节省宝贵的时间,避免采坑!


    Chinar 教程效果:
    这里写图片描述



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Delegate —— 委托


    Unity 中,委托多用于当某个值,或者物体状态发生改变的时候

    其他一些操作需要同时进行监听

    一旦状态发生,改变,所有注册在委托中的函数,都会被调用

    举个栗子黑白88
    当警察出来的时候,小偷就得逃跑

    当服务员叫餐叫号的时候,叫到谁,就该谁取餐

    等等,诸如此类的场景


    2

    Store Model —— 商店模式


    这里以一个简单的 商店模式 来模拟流程

    用委托实现,群体的函数、方法注册到对象中

    注意:

    我们需要 1 个主脚本用来管理 :服务员

    3 个顾客类:顾客 A/B/C

    为了更加生动, Chinar 用了 iTween 来处理动画效果

    页面布局如下
    举个栗子黑白88
    这里写图片描述
    采用委托的方式,通知所有顾客,谁该干什么

    分别通知对应群体对象
    这里写图片描述


    3

    Waiter —— 服务员脚本


    服务员脚本,用于管理委托对象,并在相应的按钮中调用对象

    然后委托对象,状态发生改变,就会通知所有注册到对象中的函数,都被调用
    举个栗子黑白88
    这里写图片描述

    using System.Collections;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    //委托传递的是方法/函数
    public delegate void CallNumber(); //使用时,必须要声明委托对象;返回值类型,要与将要注册到委托对象中的函数,返回值类型保持一致!
    
    
    public delegate int GetOuntHandler(); /*也就是:委托方法和被委托方法的类型必须保持一致*/
    
    
    public delegate bool SomeFood(string food);
    /*以上是委托函数的声明方式*/
    
    
    /// <summary>
    /// Chinar委托测试类
    /// </summary>
    public class ChinarDelegate : MonoBehaviour
    {
        //方法是引用类型的对象
        //委托将一个函数 转换成了一个函数对象
        //可以将 这个函数 以 对象 的形式进行传递
        public CallNumber callNumber;  //定义委托对象   这里定义的是一个委托对象
        public SomeFood   someFood;    //定义一个有参数有返回值的委托
        public Text       WaiterSpeak; //服务员说话内容文本
        public Text       BigScreen;   //服务员说话内容文本
        public GameObject G2GameObject;
    
        /// <summary>
        /// 叫号方法 —— 绑定按钮
        /// </summary>
        public void OnClickCallNumber()
        {
            callNumber();
            Content(Color.red, "叫号啦!!!", "请100号顾客取餐!");
        }
    
    
        /// <summary>
        /// 汉堡包 —— 绑定按钮
        /// </summary>
        public void OnClickHamburger()
        {
            if (!GameObject.Find("Hamburger(Clone)")) Instantiate(Resources.Load("Hamburger"));
            someFood("汉堡");
            Content(UserTwo.temporaryText.color, "谁的汉堡?", "请B号顾客取餐!");
        }
    
    
        /// <summary>
        /// 可乐 —— 绑定按钮
        /// </summary>
        public void OnClickCola()
        {
            someFood("可乐");
            Content(UserTwo.temporaryText.color, "谁点的可乐?", "请C号顾客取餐!");
        }
    
    
        /// <summary>
        /// 封装内容简化代码
        /// </summary>
        /// <param name="color"></param>
        /// <param name="speak"></param>
        /// <param name="bigScreen"></param>
        private void Content(Color color, string speak, string bigScreen)
        {
            WaiterSpeak.text  = speak;
            WaiterSpeak.color = color;
            BigScreen.text    = bigScreen;
            StopCoroutine(ClearText());
            StartCoroutine(ClearText());
        }
    
    
        /// <summary>
        /// 清理文本内容
        /// </summary>
        /// <returns></returns>
        IEnumerator ClearText()
        {
            yield return new WaitForSeconds(3);
            WaiterSpeak.text = "";
            BigScreen.text   = "";
        }
    
    
        public static void Move(GameObject gameObject)
        {
            iTween.MoveTo(gameObject, iTween.Hash("time",                                     .7f, "x",     6.69f,                         "y",        8.6f, "easetype", iTween.EaseType.easeOutCubic));
            iTween.MoveTo(gameObject, iTween.Hash("time",                                     .7f, "x",     -13.38f,                       "y",        2.8f, "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));
            iTween.ScaleTo(gameObject.transform.Find("Speak").gameObject, iTween.Hash("time", .7f, "scale", new Vector3(0.3f, 0.3f, 0.3f), "easetype", iTween.EaseType.easeOutCubic));
            iTween.ScaleTo(gameObject.transform.Find("Speak").gameObject, iTween.Hash("time", .7f, "scale", new Vector3(1,    1,    1),    "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));
            iTween.ScaleTo(gameObject,                                    iTween.Hash("time", .7f, "scale", new Vector3(3,    3,    3),    "easetype", iTween.EaseType.easeOutCubic));
            iTween.ScaleTo(gameObject,                                    iTween.Hash("time", .7f, "scale", new Vector3(1,    1,    1),    "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));
            iTween.RotateTo(gameObject, iTween.Hash("time",                                   .7f, "z",     -360.01f,                      "easetype", iTween.EaseType.easeOutCubic));
        }
    }

    4

    Client A/B/C Class —— 顾客A/B/C脚本


    3 个顾客类:顾客 A/B/C
    举个栗子黑白88
    这里写图片描述

    using System.Collections;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// 顾客A
    /// </summary>
    public class UserOne : MonoBehaviour
    {
        public  ChinarDelegate Cd;            //声明委托对象所在的类对象//实例化一个类对象 在内存中重新开辟一块内存空间 创建了一个新的类对象
        public static Text temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色
    
    
    
        void Start()
        {
            Cd            = GameObject.Find("MountScript").GetComponent<ChinarDelegate>(); //赋值
            Cd.callNumber += LookScreen;
            temporaryText = transform.Find("Speak/Text").GetComponent<Text>();
    
            //添加委托函数
            //委托函数的添加方式:可以用 = 号 
            //如果想添加多个委托 需要用 +=号
            //删除委托用: -=
        }
    
    
        /// <summary>
        /// 抬头看大屏幕
        /// </summary>
        public void LookScreen()
        {
            temporaryText.text = "顾客A看向大屏幕";
            StopCoroutine(ClearText());
            StartCoroutine(ClearText());
        }
    
    
        /// <summary>
        /// 清理文本内容
        /// </summary>
        /// <returns></returns>
        IEnumerator ClearText()
        {
            yield return new WaitForSeconds(3);
            temporaryText.text = "";
        }
    }

    顾客 B:

    using System.Collections;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// 顾客B
    /// </summary>
    public class UserTwo : MonoBehaviour
    {
        public        ChinarDelegate Cd;
        public static Text           temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色
    
    
        void Start()
        {
            Cd            =  GameObject.Find("MountScript").GetComponent<ChinarDelegate>();
            Cd.callNumber += LookScreen; //2添加委托函数
            Cd.someFood   += WaitHamburger;
            temporaryText =  transform.Find("Speak/Text").GetComponent<Text>();
        }
    
    
        /// <summary>
        /// 服务员叫汉堡时,委托事件才会触发
        /// </summary>
        public bool WaitHamburger(string food)
        {
            if (food == "汉堡")
            {
                temporaryText.text = "这里,我要汉堡";
                ChinarDelegate.Move(gameObject);
                iTween.MoveTo(GameObject.Find("Hamburger(Clone)"), iTween.Hash("oncomplete", "DestroyHamburger", "oncompletetarget", gameObject,           "time",     .7f,                          "x",     -13.38, "y", 2.8f, "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));
                iTween.ScaleTo(GameObject.Find("Hamburger(Clone)"), iTween.Hash("time",      .7f,                "scale",            new Vector3(0, 0, 0), "easetype", iTween.EaseType.easeOutCubic, "delay", 2.4f));
    
                StopCoroutine(ClearText());
                StartCoroutine(ClearText());
                return true;
            }
            return false;
        }
    
    
        private void DestroyHamburger()
        {
            Destroy(GameObject.Find("Hamburger(Clone)"));
        }
    
    
        /// <summary>
        /// 抬头看大屏幕
        /// </summary>
        public void LookScreen()
        {
            temporaryText.text = "顾客B看向大屏幕";
            StopCoroutine(ClearText());
            StartCoroutine(ClearText());
        }
    
    
        /// <summary>
        /// 清理文本内容
        /// </summary>
        /// <returns></returns>
        IEnumerator ClearText()
        {
            yield return new WaitForSeconds(3);
            temporaryText.text = "";
        }
    }

    顾客 C:

    using System.Collections;
    using UnityEngine;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// 顾客C
    /// </summary>
    public class UserThree : MonoBehaviour
    {
        public        ChinarDelegate Cd;            //委托对象
        public static Text           temporaryText; //临时文本,设置公有静态是为了 方便调用颜色属性,去改变服务员文本颜色
    
    
        void Start()
        {
            Cd            =  GameObject.Find("MountScript").GetComponent<ChinarDelegate>(); //获取对象
            Cd.callNumber += LookScreen;                                                    //当 叫号的委托对象中,有多个方法调用时,需要用 += 添加
            Cd.someFood   += WaitCola;                                                      //委托对象添加 顾客3的可乐
            temporaryText =  transform.Find("Speak/Text").GetComponent<Text>();
        }
    
    
        /// <summary>
        /// 服务员叫可乐时,委托事件才会触发
        /// </summary>
        public bool WaitCola(string food)
        {
            if (food == "可乐")
            {
                temporaryText.text = "这里,我要的可乐";
                ChinarDelegate.Move(gameObject);
                StopCoroutine(ClearText());
                StartCoroutine(ClearText());
                return true;
            }
    
            return false;
        }
    
    
        /// <summary>
        /// 抬头看大屏幕
        /// </summary>
        public void LookScreen()
        {
            temporaryText.text = "顾客C看向大屏幕";
            StopCoroutine(ClearText());
            StartCoroutine(ClearText());
        }
    
    
        /// <summary>
        /// 清理文本内容
        /// </summary>
        /// <returns></returns>
        IEnumerator ClearText()
        {
            yield return new WaitForSeconds(3);
            temporaryText.text = "";
        }
    }

    5

    Demo —— 演示样本


    Chinar 提供了演示样本,节省大家搭建界面的时间

    便于大家理解
    举个栗子黑白88

    Chinar 委托演示项目


    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !





    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址
    >

    展开全文
  • c# delegate用法

    2020-10-22 14:44:46
    his.BeginInvoke(new EventHandler(delegate(Object sd, EventArgs ag) { DataTable tab = (DataTable)sd; smsView.DataSource = tab; }), new object[] { dt }); System.Thread
    his.BeginInvoke(new EventHandler(delegate(Object sd, EventArgs ag)
                        {
                            DataTable tab = (DataTable)sd;
                            smsView.DataSource = tab;
                        }), new object[] { dt });
    
    
     System.Threading.Tasks.Task.Factory.StartNew(() =>
                {             
                            this.Invoke(new Action(() =>
                            {
                                richTextBox1.AppendText("[info] Found : [info]" + Environment.NewLine);
                             }));                    
                    
                });
    
    展开全文
  • C# delegate 用法

    千次阅读 2016-10-27 11:15:38
    1、个人对delegate的理解 delegate 委托,将函数当做变量来操作,调用委托实例时会调用它绑定的函数。2、委托的定义 委托的声明原型是 delegate <函数返回类型> <委托名> (<函数参数>); 例子: public ...
  • ios delegate 用法

    千次阅读 2014-06-21 16:09:12
    第一个文件,我称之为定义delegate的文件,要做的事: 1. 在BorderDetectionViewController.h中做两件事 (1) @protocol BorderDetectionViewControllerDelegate - (void)dismissBorderDetectionView; @...
  • C# Delegate用法

    2012-10-28 11:23:58
    对于delegate的通俗理解就是一个指向函数的指针,它的出现使函数可以像变量一样写到函数列表中去,下面跟随一个实例去了解下:  由于只是为了解其用法,所以建一个控制台应用程序完全足够满足要求(先贴代码,然后...
  • C#中的委托 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到...
  • Trim,delegate用法

    2014-05-30 15:24:49
    delegate(委托):一个 delegate type 的声明一般由四部分组成:(a) 访问级别;(b) 关键字 delegate;(c)返回型别,以及该 delegate type 所搭载之方法的声明形式(signature);(d) delegate type 的名称,被放置于...
  • Rails中delegate用法

    千次阅读 2014-08-11 15:19:55
    class C attr_accessor :obj delegate :size, :to => :obj end c=C.new c.obj=[1,2,3] c.size # 3
  • Unity3D delegate 用法

    2013-08-09 15:39:00
    delegate:委托机制,不做一一说明; 功能需求1: 音量,为一事件为B; 改变音量如为0,为事件A。也触发事件B; 音量变,所有音乐,如场景,特效,角色,打斗。其所有音量都得变。为C; 思路: B事件: Public...
  • list find delegate用法

    2012-08-21 15:15:10
    List> table = new List>();  UInt32 element = table[index].Find(delegate(UInt32 num) { return ((num & 0x000FFFFF) == symbol_word); });
  • C#中delegate用法(带参数)

    千次阅读 2017-10-25 18:38:32
    近期写了几个C#客户端软件,其中,上传数据...用法如下: //委托 public delegate void delegate1(string str); //方法 private void showUpdateProgress(string content) { //... rtbxUploadLog.Text += content;
  • .net 中delegate用法

    2013-04-27 17:01:27
    目前本人了解的用法有下面三种 匿名方法事件委托 1.不可以用等号赋值 2.只可以用“+=”,“-=” 搭载方法 3.触发搭载方法(invoke)的访问级别为private ,只可以在本类中触发,如果需要在其他类中触发...
  • [ios] delegate用法

    2014-01-24 08:31:02
    认为delegate 也是nsnotication一样的一种消息发送机制. 1.定义delegate testA类的h文件 @protocol testDelegate; 1.@interface testA:NSObject @property(assign) id mydelegate;  @end @protocel ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 989
精华内容 395
关键字:

delegate用法