被代理搞了很长时间了,有时候觉得懂了,但是再仔细想想感觉又不懂了,所以下定了决心从c的函数指针,到引用,到
数组进行了一次指针的进化论分析,结果如下。
代理应该说是一种安全的函数指针,函数指针存放的是函数的首地址,但是还是指针,只要是指针都有可能指错方向,
估计没有一个c++/c的程序员说他的指针从来没有指错过地方,除非你不用。
但是一些功能的实现非要指针,代理才会达到效率的需要,比方class a 中的方法a1调用class b中的方法b1.
而代理是从system.delegate派生而来的,对于安全性做了很高的考虑因此不用担心像指针那样,做了错误的指向,甚至
引起系统的坍塌,而且代理可以指向静态函数,函数指针是不行的。
在使用上也要有一定认识,函数指针的使用根一般的整形指针,字符指针的声明还是有比较大的区别的。
例如:void(*fp)(); fp就是一个函数指针,用于指向无参数无返回值的函数。相对应的函数也需要是无参无返回的类
型。
void(*fp2)(int);同fp一样,不过有了形式参数而已。
比较聪明的做法是使用typedef。
例如typedef void(*fp)();
fp fs3;
这样方便了很多。含义同fp的意义一样。
而代理的使用方法更像是对于一个类的操作,不过这个类是seal型的。
例如 public delegate int mydelegate(string mess);
同函数指针一样返回值和参数要和方法对应。
下面就是实际的应用对比了。
void f1()
{
write("hello world");
}
fp = &f1 //或者是fp = f1含义是一样的,都是获取函数首地址。
调用的时候非常简单只需要
fp();就可以实现。如果有参数要带上参数 fp2(2);
这样同样也实现了函数作为参数进行调用的功能。
class exam
{
int f1()
{
write("hello world");
}
}
exam p = new exam();
mydelegate ff = new mydelegate(p.f1);
调用的时候只需要 int d = ff();
这些是代理的基本作用和基本含义,在实际的c#应用过程中,代理经常是和事件一起出现的。
public event EventHandler Click;//在一个类中定义一个事件。可能有人会说有了代理为什么还要有事件,那是因为
为了处理用户界面发生的事件。
this.button2 = new System.Windows.Forms.Button();
public delegate void EventHandler(object sender, EventArgs e);//看到了么有着同样的形参和返回类型。
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("hello world");
}
this.button2.Click += new System.EventHandler(this.button2_Click);//最后做一下绑定,完成了事件和代理的绑
定,单击按钮的时候发生button2_Click的事件。
很多东西你会以为自己看懂了,但是当你进一步深入底层,你再回头看一些算法,或者概念,你会觉得原来以为看懂的
东西其实不是那么明白,新的技术概念层出不穷,但是深入到底层,你会发现仍然是对那些老的东西的新操作而已,所
以明白了底层,再懂得基本算法的底层如何运行,我想再新的技术你也会超速度的掌握,所谓万变不离其中就是这个道
理,数据结构,编译原理像房屋的地基和架构一样