大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C#之委托与事件

C#之委托与事件(1)

关键词:委托事件  阅读(1014) 赞(20)

[摘要]本文是对C#之委托与事件的讲解,与大家分享。

废话一堆:网上关于委托、事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解。

1. 委托

1.1 委托的使用

这一小章来学习一下怎么简单的使用委托,了解一些基本的知识。

这里先看一下其他所要用到的类的信息

/// <summary>

/// 函数用例

/// </summary>

public class ManyMethodClass

{

public ManyMethodClass() { }

/// <summary>

/// 实例函数

/// </summary>

/// <param name="strmes"></param>

public void InstanceMethod(string strmes)

{

Console.WriteLine("实例函数输出:" + strmes);

}

/// <summary>

/// 静态函数

/// </summary>

/// <param name="strmes"></param>

public static void StaticMethod(string strmes)

{

Console.WriteLine("静态函数输出:" + strmes);

}

}

  • 定义一个委托类型

public delegate void DisplayStringDelegate(string strmes);

  • 实例化委托类型

//绑定实例函数 第一种定义方式(实例函数)

DisplayStringDelegate disstrdele_instance = new DisplayStringDelegate(new ManyMethodClass().InstanceMethod);

//绑定静态函数 第二种定义方式(静态函数)

DisplayStringDelegate disstrdele_static = new DisplayStringDelegate(ManyMethodClass.StaticMethod);

//绑定委托实例 第三种定义方式(委托实例)

DisplayStringDelegate disstrdele_delegate = new DisplayStringDelegate(disstrdele_instance);

  • 调用委托实例

disstrdele_instance.Invoke("Hello Word");

disstrdele_static("Hello Word");

disstrdele_delegate("Hello Word");

(ps:这里不同的调用方式效果都是一样的,在下一节会有讲到)

最后让我们看一下最终的效果图:

1.2 委托的定义

  • 委托类型是类类型

/// <summary>

/// 委托示例类

/// </summary>

public class DelegateDemonStration

{

public DelegateDemonStration() { }

public delegate void DisplayStringDelegate(string strmes);

}

在上面的示例代码中,我们定义了一个委托示例类DelegateDemonStration,在DelegateDemonStration的内部我们定义了上一节中讲到的委托的类型DisplayStringDelegate,

在这里先不谈DisplayStringDelegate它定义签名类型,先来谈谈它到底是什么样的存在。

我们来看一下代码:

/// <summary>

/// 委托示例类

/// </summary>

public class DelegateDemonStration

{

public DelegateDemonStration() { }

public class DisplayStringDelegate : MulticastDelegate

{

public DisplayStringDelegate(object @object, IntPtr method){}

public virtual IAsyncResult BeginInvoke(string strmes, AsyncCallback callback, object @object);

public virtual void EndInvoke(IAsyncResult result);

public virtual void Invoke(string strmes);

}

}

当我们定义好一个委托类型的时候,在运行时C#编译器把【public delegate void DisplayStringDelegate(string strmes);】

编译为【public class DisplayStringDelegate : MulticastDelegate】

所以,各位客官只要记住 在你定义一个委托类型的时候实际上你是定义了一个类

  • 委托实例是函数指针

先让我们来看一下这一小节所要用到的示例代码(所用到的对象类型还是上一小节的内容):

DisplayStringDelegate disstrdele = new DisplayStringDelegate(new ManyMethodClass().InstanceMethod);

disstrdele += ManyMethodClass.StaticMethod;//这里是委托类型推断 绑定函数的一种方式 几种方式可以自行百度

disstrdele += new DisplayStringDelegate(ManyMethodClass.StaticMethod);

1.第一步 在我们执行DisplayStringDelegate disstrdele = new DisplayStringDelegate(new ManyMethodClass().InstanceMethod);的时候,disstrdele实例是如下图一样:

2.第二步 当我们继续执行代码 disstrdele += ManyMethodClass.StaticMethod;的时候,请再来看图:

这是disstrdele多指向了一个函数地址,而它的内部实现并不是外表看起来这样简单的:

这里简要的说一下执行第二步的时候

L_0012:是将第一步的disstrdele实例压入栈中

«上一页12下一页»


相关评论