//这是三段位置不在一起的代码
public delegate void MyInvoke(string str1,string str2);
//这个东西叫代理函数,最近有了解
MyInvoke mi = new MyInvoke(UpdateForm);
//我想知道这是什么使用方法?有点像指针类型的函数,但是看上去又不像?
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?

解决方案 »

  1.   

    回复2楼,不理解:声明里说的是一个void返回值有delegate属性的函数呀!并没有声明成类。
      

  2.   

    就是一种特殊定义类型的方式class A
    {
       
    } //定义类型Adelegate void  MyInvoke(int a,int b); //定义类型MyInvoke定义一个类型 不仅仅使用 class struct enum  之类的
      

  3.   

    呵呵 明显的  委托 在委托方法里面 判断
    InvokeRequired
    public void UpdateForm(string param1,string parm2)
    {
    if(this.textBox1.InvokeRequired)
    this.Invoke(mi,param1,parm2);
    else
    this.textBox1.Text = param1+parm2;
    }这样就完善一点了
      

  4.   

    public static MyInvoke mi = new MyInvoke(UpdateForm);这样 别的线程也可以使用这个委托了
      

  5.   

    你这是人身攻击?我没说你已经不错了,居然说委托就是类,小白到家了,居然还没自知之明。
    委托的本质确实是类,委托都是System.Delegate的子类。
      

  6.   


    我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
    意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
    《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比C/C++的函数指针,C#给出更好的概念和语法~
    委托 = 函数指针
    事件 = 给函数指针赋值(可以赋多个值)另外委托也是类~
    如果普通类型是定义数据的类型(定义一种数据结构的类)
    那么委托是定义方法的类型(定义一种函数签名的类)另外来补充一下很有哲学的话,事物分内容和形式求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?
    在C#的领域中,我们还是把他看作是类,当然你只要跟C C++的程序员说是函数指针,那么他也是秒懂的~MyInvoke mi = new MyInvoke(UpdateForm); 这个只是给委托(函数指针)赋值的形式
    mi+=UpdateForm; 还可以这样~委托比函数指针更好的地方是
    函数指针只能赋值一次事件可以+= -=操作符来控制要调用函数列表~
      

  7.   

    你们的见解都是错误的,委托不能说是类,只是为了方便使用,定义了一个叫Delegate的委托类型作为了委托的访问入口,等价于object。如果玩过反射的都知道,想要使用反射创建一个委托,是不能使用Type直接创建的,而class或者struct就可以直接依赖Type创建其对象。反射创建委托是必须反射委托所在的类型,找到其下面的Method,再通过Method得到其委托。另外使用IL对委托的实质探索的话,会发现它虽然有继承关系,但是丝毫没有类的特性,只是利用了继承关系方便对其调用而已(继承Object、继承Delegate),方便作为参数传递。再打个比方,结构体和类都继承与object,但是却不能说结构体就是类,仅仅为了方便让Object能表示所有对象而已。
      

  8.   

    你们的见解都是错误的,委托不能说是类,只是为了方便使用,定义了一个叫Delegate的委托类型作为了委托的访问入口,等价于object。如果玩过反射的都知道,想要使用反射创建一个委托,是不能使用Type直接创建的,而class或者struct就可以直接依赖Type创建其对象。反射创建委托是必须反射委托所在的类型,找到其下面的Method,再通过Method得到其委托。另外使用IL对委托的实质探索的话,会发现它虽然有继承关系,但是丝毫没有类的特性,只是利用了继承关系方便对其调用而已(继承Object、继承Delegate),方便作为参数传递。再打个比方,结构体和类都继承与object,但是却不能说结构体就是类,仅仅为了方便让Object能表示所有对象而已。
    这个问题和光的波粒二象性差不多,你不能承认了一个就否认另一个。
      

  9.   

    你们的见解都是错误的,委托不能说是类,只是为了方便使用,定义了一个叫Delegate的委托类型作为了委托的访问入口,等价于object。如果玩过反射的都知道,想要使用反射创建一个委托,是不能使用Type直接创建的,而class或者struct就可以直接依赖Type创建其对象。反射创建委托是必须反射委托所在的类型,找到其下面的Method,再通过Method得到其委托。另外使用IL对委托的实质探索的话,会发现它虽然有继承关系,但是丝毫没有类的特性,只是利用了继承关系方便对其调用而已(继承Object、继承Delegate),方便作为参数传递。再打个比方,结构体和类都继承与object,但是却不能说结构体就是类,仅仅为了方便让Object能表示所有对象而已。
    这个问题和光的波粒二象性差不多,你不能承认了一个就否认另一个。是的,在CLR的层面上看,委托就是类,在C#语法的层面看,委托就不是类。
      

  10.   

    委托可以理解成函数指针,它的定义就是一个函数的签名, 第二句是Delegate的赋值方式,建议你这种概念性的东西还是上msdn看专业的解释. http://msdn.microsoft.com/en-us/library/ms173171(v=vs.90).aspx
      

  11.   

    完全不是那么一回事。
    语言有共通性,虽然C#有和C++一样的类和结构体,但你不能说C#就是C++,虽然C#和Java一样是中间语言执行的,你不能说C#就是Java。虽然委托和类有相似的结构,你不能说委托就是类。用作某个特殊用途的类型,即使还保留一部分原生特性,那已经是另一个东西了,而光的波粒二象性本来就是同一个东西。从新的角度认识委托,有利于理解和使用,硬是要和类扯上关系的话,很多地方会模糊不清,似懂非懂。
      

  12.   


    我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
    意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
    《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比C/C++的函数指针,C#给出更好的概念和语法~
    委托 = 函数指针
    事件 = 给函数指针赋值(可以赋多个值)另外委托也是类~
    如果普通类型是定义数据的类型(定义一种数据结构的类)
    那么委托是定义方法的类型(定义一种函数签名的类)另外来补充一下很有哲学的话,事物分内容和形式求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?
    在C#的领域中,我们还是把他看作是类,当然你只要跟C C++的程序员说是函数指针,那么他也是秒懂的~MyInvoke mi = new MyInvoke(UpdateForm); 这个只是给委托(函数指针)赋值的形式
    mi+=UpdateForm; 还可以这样~委托比函数指针更好的地方是
    函数指针只能赋值一次事件可以+= -=操作符来控制要调用函数列表~
    将委托比喻成“函数指针”,还不如不解释。
      

  13.   


    我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
    意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
    《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比C/C++的函数指针,C#给出更好的概念和语法~
    委托 = 函数指针
    事件 = 给函数指针赋值(可以赋多个值)另外委托也是类~
    如果普通类型是定义数据的类型(定义一种数据结构的类)
    那么委托是定义方法的类型(定义一种函数签名的类)另外来补充一下很有哲学的话,事物分内容和形式求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?
    在C#的领域中,我们还是把他看作是类,当然你只要跟C C++的程序员说是函数指针,那么他也是秒懂的~MyInvoke mi = new MyInvoke(UpdateForm); 这个只是给委托(函数指针)赋值的形式
    mi+=UpdateForm; 还可以这样~委托比函数指针更好的地方是
    函数指针只能赋值一次事件可以+= -=操作符来控制要调用函数列表~
    将委托比喻成“函数指针”,还不如不解释。结合16楼给出的帖子 看中文版本的
    http://msdn.microsoft.com/zh-cn/library/ms173171(v=vs.90).aspx
    其中两句
    委托是一种定义方法签名的类型
    委托类似于 C++ 函数指针,但它们是类型安全的。和我说的[那么委托是定义方法的类型(定义一种函数签名的类)]
    还有比函数指针比喻类型有什么不妥~我在已开始就用了
    《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 
    简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下用函数指针来比喻一下委托 有什么不妥~?而我也补充了:事物分内容和形式
    内容就是要迟绑定要调用的方法~
    形式:C C++ 函数指针, C# 委托,事件~
    两种形式都是为了实现一个目标的~
      

  14.   

    完全不是那么一回事。
    语言有共通性,虽然C#有和C++一样的类和结构体,但你不能说C#就是C++,虽然C#和Java一样是中间语言执行的,你不能说C#就是Java。虽然委托和类有相似的结构,你不能说委托就是类。用作某个特殊用途的类型,即使还保留一部分原生特性,那已经是另一个东西了,而光的波粒二象性本来就是同一个东西。从新的角度认识委托,有利于理解和使用,硬是要和类扯上关系的话,很多地方会模糊不清,似懂非懂。在c++里面你可以说一个东西不是类像c#和java这种完全面向对象的东西里面 一切都是类 哪有不是类的变量
      

  15.   

    你这样先入为主的观点是最可怕的,Java是完全面向对象的没错,但是C#并不是,你直接站在完全面向对象的角度就不可能认识问题。如果完全面向对象了,你如何解释C#能够支持指针的使用(Java怎么都不支持)。
      

  16.   

    翻了翻MSDN之后好像懂了。我对第一句话的理解出现了问题。public delegate void MyInvoke(string str1,string str2); 
    //我本来以为delegate和public这种标志是类似的,查MSDN才知道原来delegate是个抽象类于是乎这句话的意思就是:给抽象类delegate具体化到实体类MyInvoke中(虽然语法还是没看懂)。
    那么MyInvoke当然就是个Class了。那么第二句自然顺理成章。
    你们给我说说第一句的语法吧。这句话听上去像是声明了一个继承类,但好像又使用了奇怪的语法,我查了好久都没找到。
      

  17.   

    请用新的概念去理解它,摆脱类的束缚,那样才能更好的理解和掌握它。委托除了继承Delegate外,根本不能按照类的用法去使用它,所以你使用类的理解方式是不行的,那么就作为一种新概念去理解反而会更轻松。事实上就连IL里面也没有丝毫按照类在处理,之所以和类挂钩,无非是要用到类的对象实例化这个概念,将抽象的函数方法具体化。
      

  18.   

    你所谓的“在C#语法的层面”是个什么层面,有CLASS声明的才叫类?
      

  19.   

    public delegate void MyInvoke(string str1,string str2); 
    //我本来以为delegate和public这种标志是类似的,查MSDN才知道原来delegate是个抽象类的确有个delegate的类, 但这里delegate是一个关键词
    http://msdn.microsoft.com/zh-cn/library/system.delegate(v=vs.90).aspx
    Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。
    大多数语言实现 delegate 关键字,这些语言的编译器能够从 MulticastDelegate 类进行派生;所以,用户应当使用语言所提供的 delegate 关键字。这里有一个编译器的概念~ 相当于翻译者~ 把你写好的代码翻译一下~ 翻译后意思差不多~ 但形式上会变
    编译器会把
    public delegate void MyInvoke(string str1,string str2);
    可能编译成 MyInvoke 继承 MulticastDelegate : Delegate ;好了,暂时不纠结编译器编译后的样子//按上面说的话,我们不能自己写代码MyInvoke 继承 MulticastDelegate : Delegate public delegate void MyInvoke(string str1,string str2); 
    我们来分解这句话的语法好了~
    public 访问级别 public
    delegate 声明是要定义一个委托,定义委托的类型就是后面的函数签名
    void MyInvoke(string str1,string str2); 函数签名前面的public delegate有点固定
    后面的函数前面是我们定义的关键~
    有点像我们定义类
    public class           //在没有显示声明是,继承Object
    [...我们可以定义的...]public delegate        //不能显示继承谁,强制默认继承MulticastDelegate:Delegate ... ....
    [...我们可以定义的...]记住我前面说的 内容和形式~
      

  20.   

    你这样先入为主的观点是最可怕的,Java是完全面向对象的没错,但是C#并不是,你直接站在完全面向对象的角度就不可能认识问题。如果完全面向对象了,你如何解释C#能够支持指针的使用(Java怎么都不支持)。我是这样理解的:
    java所有东西都是托管的
    而c#可以在非托管堆分配东西(unsafe)  对象的引用和指针从本质上来说都是做解引用操作
    只是指向的地方不同罢了
      

  21.   


    有意思
    这就好比 int是关键词 是基本类型
    Int32是struct 它里面封装了一个int 但是他们两个的大小和数据结构都相同
    所有加减乘除之类的基本操作都当做int使用 所有调用方法都当做Int32
    所以编译之后是一个东西即使语法上不等价
      

  22.   

    C#的委托,最常用的界面显示中跨线程调用经常用到。如果学过C++知道函数指针的话这个c#中的代理会很好理解。
      

  23.   

    你所谓的“在C#语法的层面”是个什么层面,有CLASS声明的才叫类?
    caozhy说的是对的,
    大家吵来吵去,连delegate和Delegate的大小写都没分清楚
      

  24.   

    求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?MyInvoke 是 一种类型 的 函数; 而他的作用类似 函数指针
    C#是一种强类型语言~ 连函数指针都要是强类型的~ 简单来说就是要符合类型~给你看看js这中弱类型的语言~他的函数指针~ 
    funcation F1(a,b,c)
    funcation F2(a,b)
    .....写不出来反正就是我声明函数需要3个参数,你可以传2个参数函数,也可以传4个参数给函数~
    或者第一个参数我要求是int,但你却传给我string~
    当然运行的时候可能会报错~ 而C#强类型,就在编译的时候查看是否符合定义~
    但使用反射调用方法的时候~又像js一样~ 随便传~ 但运行时可能报错~
      

  25.   

    其实MSDN阐述的一清二楚对于C#:
    具体参见:delegate (C# Reference)对于.netFrameWork:
    具体参见:Delegate Class delegate,class,inteface都是引用类型
    Delegate类,是delegate类型的基类
      

  26.   

    delegate是个新物种,不能说是类。就好像C#里的struct你也不能说他是类,虽然他也是继承自Object。但是你要从广义上来理解,Object是一个类吧,那么继承自他的应该全都是类。还是别纠结与他是什么了,还是了解下他有什么用,怎么用比较好。
      

  27.   

    C#中的委托
    //这是三段位置不在一起的代码 
    public delegate void MyInvoke(string str1,string str2); 
    //这个东西叫代理函数,最近有了解 MyInvoke mi = new MyInvoke(UpdateForm); 
    //我想知道这是什么使用方法?有点像指针类型的函数,但是看上去又不像? 
    public void UpdateForm(string param1,string parm2) 

       this.textBox1.Text = param1+parm2; 
    }
     
    和函数指针差不多,至少用法和目的都是一致的...
    public class A
    {
       public void Hello(string param1,string parm2)
       {
       }
    }
    A a=new A();
    MyInvoke mi = a.Hello;//可以这么用MyInvoke mi = new MyInvoke(UpdateForm); 
    这里为什么用 new呢,是因为函数需要实例化
    应该可以这么用 
    MyInvoke mi =this.UpdateForm 
      

  28.   

    你这样先入为主的观点是最可怕的,Java是完全面向对象的没错,但是C#并不是,你直接站在完全面向对象的角度就不可能认识问题。如果完全面向对象了,你如何解释C#能够支持指针的使用(Java怎么都不支持)。
    其实就是分析问题的角度的不一样,委托我就是当对象看的,有构造函数(用lambda、func实例化),有成员属性和方法,进一步oo化,连函数也当成对象(like js),这些都是个人的视角问题。
    ps:纠正一点,不是c#支持指针,而是clr支持,c#就是完全面向对象的。