代理和函数指针的对比

被代理搞了很长时间了,有时候觉得懂了,但是再仔细想想感觉又不懂了,所以下定了决心从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的事件。

很多东西你会以为自己看懂了,但是当你进一步深入底层,你再回头看一些算法,或者概念,你会觉得原来以为看懂的

东西其实不是那么明白,新的技术概念层出不穷,但是深入到底层,你会发现仍然是对那些老的东西的新操作而已,所

以明白了底层,再懂得基本算法的底层如何运行,我想再新的技术你也会超速度的掌握,所谓万变不离其中就是这个道

理,数据结构,编译原理像房屋的地基和架构一样 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值