委托、事件、匿名的小谈

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

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

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

先从定义一个委托出发:

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

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

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

时间: 2024-10-12 05:32:52

委托、事件、匿名的小谈的相关文章

委托+事件的一个小例子

Form2中的输入传到Form1中textBox中: Form2作为事件发送者: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Fo

C#解惑1——委托&事件(转)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性. 委托和事件在.NET Framework[1]中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 c#委托 外文名 Delegate 编程语言 C# 作    用 方便的引用被委托的方法 应    用 NET Framework 目录 1引言 2参数

委托,匿名函数和lambda表达式

很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一下自己对他的印象,顺便把自己的感悟和想法写出来,以便自己能有更深的理解,由于本人水平有限,也欢迎大家多多探讨,有问题大家一起解决一起进步. MSDN上面对委托的定义是:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在我看来委托的特性主要在: 1.把一个方法当做一个参数传递给

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树

五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树 https://masuit.com/81 曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五分钟内看完这篇博客 第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: 1 2 3 4 5 6 7 8 9 10 11 12

C# 匿名委托、匿名方法、匿名对象、Lambda表达式

一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello" };var v = new[] {     new { Name = "Micro", Message = "Hello" },     new { Name = "Soft", Message = "Wold!" }};匿

C#匿名委托,匿名函数,lambda表达式

一.类型.变量.实例之间的关系. 类型>变量>实例 类型可以创建变量,实体类可以创建实例,实例可以存储在变量里. 二.委托使用过程: 1.定义委托(写好签名): 2.创建委托变量: 3.在委托变量里放函数(相同的签名). 事件:用预先定义好的委托(EventHandle)的定义的变量(接收两个参数). 窗体里自带一个委托变量:我们做的就是给这个变量追加函数. 给窗体Load事件添加一个函数 public partial class Form1 : Form { public Form1() {

3 委托、匿名函数、lambda表达式

委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式 // 声明一个委托 delegate void Printer(string s); class TestClass { static void Main() { //lambda表达式 Printer pp = x => { Console.WriteLine(&quo

C#笔记-委托&事件

1.1.委托 可以认为委托是持有一个或多个方法的对象.被执行时会执行他所有“持有” 的方法 可以把它看一个类型安全的, 面向对象的c++函数指针 委托和类一样, 是一种用户自定义的类型.而委托持有一个或多个方法. delegate void Mydel(int value); // 声明一个委托类型 #声明一个委托, 看上去和方法声明相似,只是没有实现块. #使用该委托类型声明一个委托变量. #创建一个委托的对象,赋值给委托变量.新的委托对象包括指向某个方法的引用,签名(包括ref,out)和返

一场武林盟主争霸赛-观察者模式PK委托事件技术

设计模式中提到观察者模式又叫做发布-订阅(Publish-订阅)模式.它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有 观察者对象,使它们能够自动更新自己. C#中提到,委托是对函数的封装,可以当作给方法的特征指定一个名称.而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程.事件其实就是设计模式中观察者模式在.NET中的一种实现方式. 委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的