委托事件匿名的小谈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托事件匿名的小谈相关的知识,希望对你有一定的参考价值。

有一段时间我在写异步方法的时候碰到了异步调用同步控件的问题,那时候我找到很多的都是关于委托的相关资料,但是那时候我并不是特别明白。

委托到底是什么?为什么会出现?

这个问题,虽然现在不是很了解,但至少我已经找到了一个理解的办法。

先从定义一个委托出发:

public delegate string Trans(string a)

这是一个委托,它也和方法、函数的定义一样,具有自己的签名,以及返回值声明。如果有读者又不理解的,我希望是回头看看语法书上的说明,这里

就不多阐述。

我们先看一个实例:

技术分享
public delegate string Name(string str);//定义一个委托,具有一类函数的原型
public string A(string src)
{
     return src+"A";        
}
public string B(string src)
{
    return src+"B";
}
static Main(string[] Args)
{
     Name=A;//用A函数作为实现委托的方法
     Console.WriteLine(Name("这是e"));
     Name=B;//用B函数作为实现委托的方法
     Console.WriteLine(Name("这是e"));
}
技术分享

接下来是输出结果:

输出:
    这是eA
    这是eB

我们来解释一下委托。在解释之前,我们先来谈谈C语言里面的函数指针。

首先,函数与变量一样,是具有内存地址的!我们在调用一个函数的时候,计算机会为每个函数分配一个地址,这个地址存储着形参、变量以及一些声明的内容。

正因为这样,我们可以获取到函数的指针。

比如:

技术分享
void main()
{
    void  (*ptr)(int)=fun;
    ptr(16);
}
void fun(int num)
{
    printf("%d\\n",num*num);
}
技术分享

输出结果自然为256.

对比一下两者,如果学过C语言的就会明白,委托其实就相当于C语言里面的函数指针,没学过也不要紧(2016.6.11 添加修改)。

只要它代表的是某个返回值、参数类型、参数数目与委托定义的一样的函数(方法)。那么就可以像正常方法一样传递参数,完成调用。这里的调用实际上是调用

用来实现委托的方法,即上面的例子中的A、B函数

 

(2016.6.11  添加回答)实际上委托只是一个代理,要求是,被委托的函数形参的参数类型(变量类型)与委托一致。;返回值一致

 

 

这里附上张子阳先生的博客园,我当初就是在子阳先生的指导下获得一些感悟的。

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

子阳先生的实例简直是鬼斧神工,但是本人能力有限,一开始并不能准确的使用委托。后来有了一定的经验积累,慢慢的也开始了解委托的本来面目。

 

匿名方程的部分放到下次的时候在写吧!

 

以上是关于委托事件匿名的小谈的主要内容,如果未能解决你的问题,请参考以下文章

C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例

unity的C#学习——委托事件和匿名方法

C#学习之初步理解委托事件匿名方法和Lambda

Delegate,Action,Func,匿名方法,匿名委托,事件

委托泛型委托多播委托匿名函数lamda表达式事件

委托与事件