//这是三段位置不在一起的代码
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是一个函数指针还是个类?怎么理解第二句话?
{
} //定义类型Adelegate void MyInvoke(int a,int b); //定义类型MyInvoke定义一个类型 不仅仅使用 class struct enum 之类的
InvokeRequired
public void UpdateForm(string param1,string parm2)
{
if(this.textBox1.InvokeRequired)
this.Invoke(mi,param1,parm2);
else
this.textBox1.Text = param1+parm2;
}这样就完善一点了
委托的本质确实是类,委托都是System.Delegate的子类。
我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比C/C++的函数指针,C#给出更好的概念和语法~
委托 = 函数指针
事件 = 给函数指针赋值(可以赋多个值)另外委托也是类~
如果普通类型是定义数据的类型(定义一种数据结构的类)
那么委托是定义方法的类型(定义一种函数签名的类)另外来补充一下很有哲学的话,事物分内容和形式求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?
在C#的领域中,我们还是把他看作是类,当然你只要跟C C++的程序员说是函数指针,那么他也是秒懂的~MyInvoke mi = new MyInvoke(UpdateForm); 这个只是给委托(函数指针)赋值的形式
mi+=UpdateForm; 还可以这样~委托比函数指针更好的地方是
函数指针只能赋值一次事件可以+= -=操作符来控制要调用函数列表~
这个问题和光的波粒二象性差不多,你不能承认了一个就否认另一个。
这个问题和光的波粒二象性差不多,你不能承认了一个就否认另一个。是的,在CLR的层面上看,委托就是类,在C#语法的层面看,委托就不是类。
语言有共通性,虽然C#有和C++一样的类和结构体,但你不能说C#就是C++,虽然C#和Java一样是中间语言执行的,你不能说C#就是Java。虽然委托和类有相似的结构,你不能说委托就是类。用作某个特殊用途的类型,即使还保留一部分原生特性,那已经是另一个东西了,而光的波粒二象性本来就是同一个东西。从新的角度认识委托,有利于理解和使用,硬是要和类扯上关系的话,很多地方会模糊不清,似懂非懂。
我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比C/C++的函数指针,C#给出更好的概念和语法~
委托 = 函数指针
事件 = 给函数指针赋值(可以赋多个值)另外委托也是类~
如果普通类型是定义数据的类型(定义一种数据结构的类)
那么委托是定义方法的类型(定义一种函数签名的类)另外来补充一下很有哲学的话,事物分内容和形式求助MyInvoke是一个函数指针还是个类?怎么理解第二句话?
在C#的领域中,我们还是把他看作是类,当然你只要跟C C++的程序员说是函数指针,那么他也是秒懂的~MyInvoke mi = new MyInvoke(UpdateForm); 这个只是给委托(函数指针)赋值的形式
mi+=UpdateForm; 还可以这样~委托比函数指针更好的地方是
函数指针只能赋值一次事件可以+= -=操作符来控制要调用函数列表~
将委托比喻成“函数指针”,还不如不解释。
我也来打击你那几颗星~ 看我的解释~触类旁通 :触:碰,遇到;旁:别的;通:懂得。
意思:比喻掌握了解某一事物的变化、趋势及规律,从而类推了解同类的其他事物的变化、趋势及规律。
《周易·系辞上》:“引而伸之,触类而长之,天下之能事毕矣也。” 简单来说,遇到不懂的东西,可以试试用熟悉的东西类比一下相比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# 委托,事件~
两种形式都是为了实现一个目标的~
语言有共通性,虽然C#有和C++一样的类和结构体,但你不能说C#就是C++,虽然C#和Java一样是中间语言执行的,你不能说C#就是Java。虽然委托和类有相似的结构,你不能说委托就是类。用作某个特殊用途的类型,即使还保留一部分原生特性,那已经是另一个东西了,而光的波粒二象性本来就是同一个东西。从新的角度认识委托,有利于理解和使用,硬是要和类扯上关系的话,很多地方会模糊不清,似懂非懂。在c++里面你可以说一个东西不是类像c#和java这种完全面向对象的东西里面 一切都是类 哪有不是类的变量
//我本来以为delegate和public这种标志是类似的,查MSDN才知道原来delegate是个抽象类于是乎这句话的意思就是:给抽象类delegate具体化到实体类MyInvoke中(虽然语法还是没看懂)。
那么MyInvoke当然就是个Class了。那么第二句自然顺理成章。
你们给我说说第一句的语法吧。这句话听上去像是声明了一个继承类,但好像又使用了奇怪的语法,我查了好久都没找到。
//我本来以为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 ... ....
[...我们可以定义的...]记住我前面说的 内容和形式~
java所有东西都是托管的
而c#可以在非托管堆分配东西(unsafe) 对象的引用和指针从本质上来说都是做解引用操作
只是指向的地方不同罢了
有意思
这就好比 int是关键词 是基本类型
Int32是struct 它里面封装了一个int 但是他们两个的大小和数据结构都相同
所有加减乘除之类的基本操作都当做int使用 所有调用方法都当做Int32
所以编译之后是一个东西即使语法上不等价
caozhy说的是对的,
大家吵来吵去,连delegate和Delegate的大小写都没分清楚
C#是一种强类型语言~ 连函数指针都要是强类型的~ 简单来说就是要符合类型~给你看看js这中弱类型的语言~他的函数指针~
funcation F1(a,b,c)
funcation F2(a,b)
.....写不出来反正就是我声明函数需要3个参数,你可以传2个参数函数,也可以传4个参数给函数~
或者第一个参数我要求是int,但你却传给我string~
当然运行的时候可能会报错~ 而C#强类型,就在编译的时候查看是否符合定义~
但使用反射调用方法的时候~又像js一样~ 随便传~ 但运行时可能报错~
具体参见:delegate (C# Reference)对于.netFrameWork:
具体参见:Delegate Class delegate,class,inteface都是引用类型
Delegate类,是delegate类型的基类
//这是三段位置不在一起的代码
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
其实就是分析问题的角度的不一样,委托我就是当对象看的,有构造函数(用lambda、func实例化),有成员属性和方法,进一步oo化,连函数也当成对象(like js),这些都是个人的视角问题。
ps:纠正一点,不是c#支持指针,而是clr支持,c#就是完全面向对象的。