`
CanBeatle
  • 浏览: 168756 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详细探讨delegate(委托)和event(事件)(2)

    博客分类:
  • C#
阅读更多

delegate(2)

 

上一篇我们看了委托的概念和例子,相信很多人都会想,委托是怎么实现的?VS自带的工具ILDASM,可以查看一个exe或者dll文件的IL代码,具体方法是进入Visual Studio Tools 下的 Visual Studio Command Prompt命令行,输入ILDASM就能看到一个可视化的界面,执行File-->Open,可以选择一个exe文件,比如打开上一篇(http://canbeatle.iteye.com/admin/blogs/686138)中的程序生成的exe文件,可以看到这样的结构:

 

 类结构

 

这些内容其实很简单,注意上图中我加的图标的说明,可以看到TestMathClass中的delegate在IL中是一个class,名称为Operation,就是委托的名称,该class拥有4个method,除了构造函数外,分别是BeginInvoke, EndInvoke, Invoke,其中Invoke的签名和delegate的签名是完全一样的,是不是调用委托方法的时候就是执行的Invoke呢?

 

在我的例子中,委托是在Main函数中赋值和调用的,为了查看具体的实现,我们双击TestMathClass中的Main:void 函数,看看它的具体实现是怎么样的:

 

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       100 (0x64)
  .maxstack  3
  .locals init ([0] class EventDelegateTest.TestMathClass/Operation operation,
           [1] int64 sum,
           [2] int64 product)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  ldftn      int64 EventDelegateTest.MathClass::Add(int32, int32)
  IL_0008:  newobj     instance void EventDelegateTest.TestMathClass/Operation::.ctor(object,native int)
  IL_000d:  stloc.0
  IL_000e:  ldloc.0
  IL_000f:  ldc.i4.s   11
  IL_0011:  ldc.i4.s   22
  IL_0013:  callvirt   instance int64 EventDelegateTest.TestMathClass/Operation::Invoke(int32,int32)
  IL_0018:  stloc.1
  IL_0019:  ldnull
  IL_001a:  ldftn      int64 EventDelegateTest.MathClass::Multiply(int32,int32)
  IL_0020:  newobj     instance void EventDelegateTest.TestMathClass/Operation::.ctor(object,native int)
  IL_0025:  stloc.0
  IL_0026:  ldloc.0
  IL_0027:  ldc.i4.s   30
  IL_0029:  ldc.i4.s   40
  IL_002b:  callvirt   instance int64 EventDelegateTest.TestMathClass/Operation::Invoke(int32,int32)
  IL_0030:  stloc.2
  IL_0031:  ldstr      "11 + 22 = "
  IL_0036:  ldloc.1
  IL_0037:  box        [mscorlib]System.Int64
  IL_003c:  call       string [mscorlib]System.String::Concat(object, object)
  IL_0041:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0046:  nop
  IL_0047:  ldstr      "30 * 40 = "
  IL_004c:  ldloc.2
  IL_004d:  box        [mscorlib]System.Int64
  IL_0052:  call       string [mscorlib]System.String::Concat(object, object)
  IL_0057:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_005c:  nop
  IL_005d:  call       string [mscorlib]System.Console::ReadLine()
  IL_0062:  pop
  IL_0063:  ret
} // end of method TestMathClass::Main

 这段IL代码我们不需要全看懂,只需注意这一段(Line15~17):

IL_000f:  ldc.i4.s   11
IL_0011:  ldc.i4.s   22
IL_0013:  callvirt   instance int64 EventDelegateTest.TestMathClass/Operation::Invoke(int32,int32)

 

首先load两个常量(ldc):11和22,然后调用TestMathClass/Operation::Invoke方法。这也证实了刚才的猜想:委托就是一个类,执行的时候就是调用其Invoke方法(BeginInvoke和EndInvoke以后再探讨)。下一篇(http://canbeatle.iteye.com/blog/686800)我将探讨event。

  • 大小: 100.3 KB
分享到:
评论

相关推荐

    C#中的事件和委托(Delegate,Event)

    在C#编程语言中,事件和委托是两个关键概念,它们是实现对象间通信和响应机制的核心工具。本文将深入探讨这两个概念,并提供详细的解释。 首先,我们要理解什么是委托(Delegate)。委托在C#中是一种类型,它代表了...

    NET Delegate Event Model vs COM Connection PointsNET事件模型

    在.NET Framework中,事件模型基于委托(Delegate)和事件(Event)。委托是类型安全的函数指针,它允许我们将方法作为参数传递给其他方法。事件是对象公开的一种通知机制,当特定条件满足或状态改变时,对象会触发...

    事件触发最简单例子event delegate

    在实际开发中,事件和委托广泛应用于UI编程、多线程通信、数据绑定等多种场景,提高了代码的可维护性和可扩展性。 总结来说,事件触发是对象间通信的重要方式,而委托是实现这一通信的机制。事件源通过委托将事件...

    C#中委托与事件的区别

    委托(Delegate)和事件(Event)是C#中非常重要的两种机制,它们在.NET框架中扮演着极其重要的角色。理解这两种概念,对于深入学习C#编程语言,构建高效、可维护的程序架构至关重要。首先我们来探讨一下委托的概念...

    Delegate_Content_委托+事件(收集)

    在.NET框架中,委托和事件是两种非常重要的编程概念,它们是实现对象间通信和异步编程的关键。本文将深入探讨这两个主题,并结合线程使用,以帮助理解它们的细节和实际应用。 首先,让我们从基础开始,了解什么是...

    c#委托和事件教程,委托事件教程

    总的来说,委托和事件是C#中实现回调和异步编程的关键工具,它们使得代码更加灵活,能够更好地响应外部事件和用户交互。理解和熟练使用委托和事件对于开发高效、可维护的.NET应用程序至关重要。在实际编程中,它们常...

    csharp委托和事件实例

    在异步编程中,`async/await`关键字配合事件和委托,可以实现非阻塞的IO操作。 总的来说,C#中的委托和事件是构建可扩展和响应式应用的核心工具。通过理解并熟练掌握它们,开发者可以编写出更加灵活和健壮的代码。...

    winform委托和事件经典例子

    在Windows Forms(Winform)开发中,委托和事件是两个重要的概念,它们为对象间的通信提供了强大而灵活的机制。本文将深入探讨这两个概念,并通过一个经典的子父窗口互传值的例子来阐述它们的使用。 首先,让我们...

    .NET委托与事件用例

    本文将深入探讨.NET委托和事件,以及它们如何在实际应用中发挥作用。 首先,我们需要了解什么是委托。委托在.NET中可以被视为类型安全的函数指针,它允许我们将方法作为参数传递,或者存储方法以便稍后调用。这种...

    C# 中的委托和事件

    本文将深入探讨C#中的委托和事件的概念及其应用,并通过具体示例来帮助理解这些核心概念。 #### 二、委托的基本概念 ##### 2.1 委托定义 - **委托**是一种引用类型的数据结构,它用来封装方法的引用。 - 它可以...

    委托和事件 C# 课程设计 课件

    在C#编程语言中,委托和事件是两个关键概念,它们是实现面向对象程序设计中的重要组成部分。在本文中,我们将深入探讨这两个概念,并通过示例来解释它们的工作原理。 首先,让我们了解一下委托。委托在C#中可以看作...

    c#中关于委托delegate的经典的实例

    在C#编程语言中,委托(Delegate)是一个强大的特性,它允许我们将方法作为参数传递给其他方法,或者存储和调用方法的集合。这个特性在事件处理、回调函数以及实现函数式编程风格时非常有用。在本文中,我们将深入...

    C# 委托和事件 教程

    在C#编程语言中,委托和事件是两个关键的概念,它们是实现面向对象设计模式,尤其是事件驱动编程的核心。本文将深入探讨这两个概念,并提供相关的示例和应用场景,以帮助你更好地理解和应用。 首先,我们来了解**...

    Delegate Event Study

    委托和事件是C#编程语言中的核心特性,用于实现对象之间的通信和回调机制。在.NET框架中,它们扮演着至关重要的角色,特别是在设计模式和组件交互方面。让我们深入探讨这两个概念,以及如何在实际开发中有效利用它们...

    c#委托与事件的关系

    在面向对象编程语言C#中,委托(Delegate)和事件(Event)是两个重要的概念。本文将深入探讨这两者之间的关系及其在实际开发中的应用。 #### 二、委托(Delegate) 1. **定义**: - 委托在C#中类似于C++中的函数...

    委托事件PPT课件.pptx

    委托和事件是C#编程语言中的核心特性,主要用于实现对象之间的通信和异步操作。本文将深入探讨这两个概念,以及它们在实际应用中的工作原理。 首先,我们来了解委托(Delegate)。委托可以看作是面向对象的函数指针...

    C#委托代码样例DelegateDemo

    在实际应用中,C#的委托和事件广泛应用于事件驱动编程,如UI控件事件、网络通信、多线程等。例如,`System.Threading.Tasks.Task`类的`ContinueWith`方法接受一个`Action<Task>`类型的委托,用于定义在任务完成后...

Global site tag (gtag.js) - Google Analytics