关于委托自己的一点理解

  委托类型用来定义和响应应用程序中的回调, C#与.NET高级编程一书是这么说的。 

所以要先搞懂回调的概念。 回调(Callback)本身指的是可以作为参数传给其他代码的一段可执行代码, 我对于一段可执行的代码理解是姑且可以看做就是方法(Method)。 也就是说可以把方法作为参数传递给其他代码执行。 而回调从字面自已理解是相对与调用来定义的, 正常调用往往都是高层代码(如应用程序)去调用底层的函数(如系统函数,库函数),而回调则是底层函数执行时调用高层的代码。 

在C语言中有回调函数的概念是用指针来实现的, 本人对于指针的理解还只是局限在大学学的一点点知识所以对于指针就不多说了。而C#中回调功能则是通过委托来实现,而且委托更为安全和面向对象。 对于安全我的基本理解是应该是类型安全。

   对于最开始我所说的委托回调我一直不是很理解,今天结合一些例子仔细想了想,有了一些自己的想法就写了 以免以后的时候自己忘了。

   下面我用一个实际的例子来说明一下。   

定义了一个类,我们可以看做是底层的操作

    class bottomClass
    {
        public delegate void testHandler(string message);//定义一个委托类型
        private testHandler listofHandler;//定义委托的变量;
        //通过方法给委托添加方法,而封装了委托变量
        public void Regist(testHandler callback)
        {
            listofHandler += callback; //因为委托是支持多路广播的,所以可以用这种方式,其实是实现了testHandler.Combine()的方法.
           
        }
        //提供给高层所调用的方法,执行这个方法满足一定条件就会要调用 调用者提供的方法和方法的实现, 也就是把方法当做参数让底层代码来使用。
        public void show(int a)
        
        {
            if (a < 10)
            {
                listofHandler("小于10");
            }
            else
            {
                listofHandler("大于10");
            }
        }
    }

而我们在main函数入口里,就相当于高层里面,调用show(),就会根据传入的值不同而调用 调用方自己定义的方法,当然在用之前肯定得先把方法注册到委托里面去, 而这个方法是由调用者自己定义的,只需要满足当前定义委托要求的格式就行了。 可以想象事件,底层知道我们触发事件了,但是触发事件后要做什么却是由我们调用方来决定的,而我们决定后的方式则通过委托传递给底层让其操作。其实也就是相当于我们传递一个字符串要底层来操作,比如显示,加减。但是我们现在要传递是方法,所以用委托。

程序肯定有很多bug 手随便打的 不要深究。  

今天所说的都是委托的同步调用,也就是实现委托对象的invoke方法。  下一次我会把异步调用的理解写一下。


posted @ 2013-08-13 12:55  RstarYan  阅读(123)  评论(0编辑  收藏  举报
$(function(){ $('#blogTitle h1').addClass('bounceInLeft animated'); $('#blogTitle h2').addClass('bounceInRight animated'); // 删除反对按钮 $('.buryit').remove(); initCommentData(); }); function initCommentData() { $('.feedbackItem').each(function() { var text = $(this).find('.feedbackListSubtitle .layer').text(); // 将楼层信息放到data里面 // $(this).find('.blog_comment_body').attr('data-louceng', text.replace(/^#/g, '')); if($(this).find('.feedbackListSubtitle .louzhu').length>0) $(this).addClass('myself'); var avatar = $(this).find('> .feedbackCon > span').html() || 'https://pic.cnblogs.com/face/sample_face.gif'; $(this).find('> .feedbackCon > .blog_comment_body').append('') }); } $(document).ajaxComplete(function(event, xhr, settings) { // 监听获取评论ajax事件 if(settings.url.indexOf('/mvc/blog/GetComments.aspx') >= 0) { initCommentData(); } });