我眼中委托的真正面貌(三)

其实,恐怕大家在看完(一)之后便已经在心中产生了一个呼之欲出的想法——委托就是函数指针!最初,我也曾有过这样的想法,只是并未在相应的文献资料中找到支撑。然而这是后话,是当我自己对于委托的理解到达可以写得出第一篇随笔之后才可能有的见解。因此,先前的几篇虽名为《我眼中委托的真正面貌》,实则是我自己对于委托的一个探索过程,因此,我以委托常见且较有代表性的几个用法来组织文章的脉络。个人感觉,对于一个未知的对象,这样一个由浅入深的过程其实是很有必要的。至少,我希望可以帮那些和我一样对于委托并不是太了解的朋友们少走一些弯路。

不过,想法归想法,我说过暂时没有找到相应的理论支撑。因此,我仍然以探索的态度来阐述自己的一些观点,欢迎大家批评指正,同时希望已经完全摸透委托机制的高人们不吝赐教。

前不久一个偶然的机会搜到了这样一篇文章:

从函数指针到代理(C#代理入门)

作者是木头象朋友。他在文中为我们阐述了这样的观点:委托是函数指针功能的扩展。

其实,个人感觉这句话阐明的观点还是有一定的道理的,感兴趣的朋友们可以支持一下木头象朋友的帖子。这个观点究竟正确与否,我们姑且不论。然而,我们却可以以此为论题,来探讨一下委托比之函数指针究竟有哪些功能上的扩展。

C#中要了解一个对象自身的一些特质其实很简单,我们甚至无需依赖于MSDN,你只需声明相应的对象,在此之后点一个“.”,C#编译器的智能感知功能便会自动列出这个对象的相关属性及其方法的一些简单描述。

我们用一个实例化的委托对象进行如上操作,便可大致了解委托对象的一些特有的方法和属性了。这里我们讨论几个关键方法的使用方法:

9.异步委托的实现

using System.Threading;

namespace AsyncDelegate
{
    class Program
    {
        //定义委托
        delegate void MyDelegate();

        static void Main(string[] args)
        {

            //声明委托对象
            MyDelegate ObjDelegate = new MyDelegate(ObjDelegateFun);

            //使用异步方式
            IAsyncResult ObjIr = ObjDelegate.BeginInvoke(null,null);
            Console.WriteLine("委托方法执行中.");
            Thread.Sleep(5000);
            ObjDelegate.EndInvoke(ObjIr);
            Console.ReadLine();
        }

        static private void ObjDelegateFun()

        {
            Thread.Sleep(5000);

            Console.WriteLine("委托方法调用成功!");
        }
    }
}

时间: 2024-10-13 07:10:28

我眼中委托的真正面貌(三)的相关文章

我眼中委托的真正面貌(二)

对于上一篇随笔,不少朋友留下了很不错的见解,也有不少朋友提出了很有代表性的问题.所以,在正文开始之前,我想先就这些问题阐述一下自己的观点,也请朋友们给予批评指正: 首先来说,feiyang朋友提出了有关委托与函数指针间的连带关系.我很赞同这样的说法. 其实,对C++有所了解的朋友都会知道:一个类内部所包含的方法,其实在类内部仅仅表现为一个函数指针,其实现部分并未占用类的内存空间.假如我们在一个类内部声明了一个委托实例对象,同时为它挂载了其他类内部的一个方法(当然,这个方法必须是共有型的),这样,

我眼中委托的真正面貌(一)

首先我们以书中所介绍的委托的由来为起始点展开话题: 在C或C++中有时为了开启一个子线程,我们会用到如下的方法: HANDLE hThread; DWORD ThreadID; hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID); 以上语句中的ThreadFunc()为C++中的一个全局方法.因为C++或者C语言都是允许面向过程的,因此全局函数是可以存在的.但大家不妨试想一下,如果是

c#-C# 委托与事件 有点小问题

问题描述 C# 委托与事件 有点小问题 class Class1 { static void ChineseGreeting(string name) { Console.WriteLine("早上好,",name); } static void EnglishGreeting(string name) { Console.WriteLine("Good morning,",name); } static void Main(string[] args) { Gre

都说委托是指针,那么委托能代替指针么?C#中委托和指针的关系是什么

问题描述 都说委托是指针,那么委托能代替指针么?C#中委托和指针的关系是什么 都说委托是指针,那么委托能代替指针么?C#中委托和指针的关系是什么 解决方案 委托是委托,指针是指针,没有什么联系.委托代表一种类型,这种类型表示一个方法. "要是没有委托,把函数当做形参就实现不了",这是不对的.java没有委托,也可以传函数,用的是接口. 解决方案二: 委托是类型安全的方法引用一般情况下,我们用的都是对某一个对象的引用,而委托则是对对象中某一个方法的引用.其实可以把委 托理解成一个指针,调

你真的了解iOS代理设计模式吗?

本文是投稿文章,作者:刘小壮 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙.写的有点多,但都是干货,我能写下去,不知道你有没有耐心看下去.本人能力有限,如果文章中有什么问题或没有讲到的点,请帮忙指出,十分感谢! iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通

浅析C#的事件处理和自定义事件

一.了解C#中的预定义事件处理机制 在写代码前我们先来熟悉.net框架中和事件有关的类和委托,了解C#中预定义事件的处理. EventArgs是包含事件数据的类的基类,用于传递事件的细节. EventHandler是一个委托声明如下 public delegate void EventHandler( object sender , EventArgs e ) 注意这里的参数,前者是一个对象(其实这里传递的是对象的引用,如果是button1的click事件则sender就是button1),后面

网站渗透测试原理及详细过程

网站渗透测试原理及详细过程 原文地址:http://blog.csdn.net/kingmax54212008/article/details/11833059 渗透测试(Penetration Testing)目录 零.前言 一.简介 二.制定实施方案 三.具体操作过程 四.生成报告 五.测试过程中的风险及规避 参考资料 FAQ集     零.前言 渗透测试在未得到被测试方授权之前依据某些地区法律规定是违法行为. 这里我们提供的所有渗透测试方法均为(假设为)合法的评估服务,也就是通常所说的道德

task-初次使用Task<TResult>关于阻塞主线程求指教

问题描述 初次使用Task<TResult>关于阻塞主线程求指教 做了一个winform程序,点击一个按钮需要调用一个复杂耗时的方法,总是造成主界面卡死,据说Task可以解决此类情况,就上网查资料模仿,后来发现还是卡死,代码段如下: City ct = (City)cbxCity.SelectedItem; bool checkCom = cBoxDisCom.Checked; Task t = null; t = new Task(() => ImportService.FilterF

菜鸟求救串口问题 急急急!!!

问题描述 //接收数据voidsp_DataReceived(objectsender,SerialDataReceivedEventArgse){intn=sp.BytesToRead;//获取接受缓冲区中数据的字节数,(先记录下来,避免某种原因,人为的原因,操作几次之前时间长)byte[]bt=newbyte[n];//声明一个临时数组来存储串口数据sp.Read(bt,0,n);//读取数据(0是缓冲区数组中开始写入的偏移量,,n是要读取的字节数)MessageBox.Show(bt[6]