C#基础知识整理 基础知识(21) 委托(二)

看了前面一篇委托的用法中http://www.php.cn/,我们看到,

        public void Description(string programerName, DescriptionDelegate description)        {            description(programerName);        }

这个方法时传一个DescriptionDelegate description委托类型进来,那么对于这个方法再做一下修改,能用起来方便一些,代码也更合理一些。把委托封装起来,然后把不同语言的程序员描述方法提出来:
封装:

    public class ProgramDescriptionDelegate2    {        public delegate void DescriptionDelegate(string programerName);        public DescriptionDelegate myDelegate;        public void Description(string programerName)        {            myDelegate(programerName);        }    }

提出的类:

    public class TestDescriptionDelegate2    {        public void CsharpProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));        }        public void CProgramer(string programerName)        {            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));        }        public void JavaProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));        }        public void Test()        {            ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2();            pe.myDelegate = CsharpProgramer;            pe.myDelegate += CProgramer;            pe.Description("SamYang");        }    }

这样就比较合理一些,因为public void CsharpProgramer(string programerName)这些方法,应该是用户可以随时定义的,可以看做随时变动的。而ProgramDescriptionDelegate2完全作为一个公共的类,它只负责执行绑定在委托上的方法。
调用:

            TestDescriptionDelegate2 t = new TestDescriptionDelegate2();            t.Test();

输出:
C#基础知识整理 基础知识(21) 委托(二)

再回过来看ProgramDescriptionDelegate2类,public DescriptionDelegate myDelegate;应该是一个字段,根据面向对象的封装性,字段要封装为属性。那么在这里封装我们要使用一个很有用的字段event。
封装如下:

   public class ProgramerDescriptionEvent    {        public delegate void DescriptionDelegate(string programerName);        private event DescriptionDelegate myEvent;        public event DescriptionDelegate MyEvent        {            add { this.myEvent += value; }            remove { this.myEvent -= value; }        }        public void Description(string programerName)        {            myEvent(programerName);        }    }

 

  public class TestEvent    {        public void CsharpProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));        }        public void CProgramer(string programerName)        {            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));        }        public void JavaProgramer(string programerName)        {            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));        }        public void Test()        {            ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent();            pe.MyEvent += CsharpProgramer;            pe.MyEvent += JavaProgramer;            pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方        }    }

调用:

            TestEvent te = new TestEvent();            te.Test();

结果如下:
C#基础知识整理 基础知识(21) 委托(二)
可以看出,什么是事件,其实本质使用的是委托,但是使用了event是这种委托变成了一种机制,叫事件。
那么看msdn对委托和事件的描述:
事件是对象发消息,以发信号通知操作的发生,操作可能是由用户交互(鼠标、键盘操作等)引起的,或者由某些其他的程序逻辑触发。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到它引发的事件。所需要的是在源和接收方之间存在一个媒介。.NET Framework 定义了一个特殊的类型 (Delegate),该类型提供函数指针的功能。委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。例如:
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate 关键字通知编译器 AlarmEventHandler 是一个委托类型。按照约定,.NET Framework 中的事件委托有两个参数:引发事件的源和该事件的数据。即sender和e。

以上就是C#基础知识整理 基础知识(21) 委托(二)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:23:51
下一篇 2025年12月17日 06:23:58

相关推荐

  • C#基础知识整理 基础知识(20) 委托(一)

    委托和事件在c#中使用很多,尤其在进行窗体编程时,很多的操作都要通过委托和事件来处理和传递。这里详细解释下委托和事件的用法和原因,使我们在写代码时能更加明白一些。委托的使用事件是一种机制,事件是通过委托实现的,所以看明白了委托,对于事件也就能更好的理解了。先看下面一个小例子。这是描述不同语言的程序员…

    好文分享 2025年12月17日
    000
  • C# 使用绑定句柄来减少进程的内存耗用

    许多应用程序中,绑定了一组类型(type)或者类型成员(从memberinfo派生),并将这些对象保存在某种形式的一个集合中。以后,会搜索这个集合,查找特定的对象,然后调用这个对象。这是一个很好的机制,但是有个小问题:type和memberinfo派生的对象需要大量的内存。如果一个应用程序容纳了太多…

    好文分享 2025年12月17日
    000
  • C# 反射详解

    以上就是C# 反射详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

    2025年12月17日
    000
  • C# 清除事件绑定的函数

    c#  清除事件绑定的函数 #region 清除事件绑定的函数 /// /// 清除事件绑定的函数 /// /// 拥有事件的实例 /// 事件名称 public static void ClearAllEvents(object objectHasEvents, string eventName)…

    好文分享 2025年12月17日
    000
  • C#中Encoding.Unicode与Encoding.UTF8的区别

    原文地址:点击打开链接 今天在园子首页看到一篇博文-简单聊下Unicode和UTF-8,从中知道了UTF-8是Unicode的一种实现方式: Unicode只是给这世界上每个字符规定了一个统一的二进制编号,并没有规定程序该如何去存储和解析。 可以说UTF-8是Unicode实现方式之一……

    2025年12月17日
    000
  • C# Protobuf-Net 序列化

    源码位置:protobuf-net 1、安装Nuget : 工具–拓展管理器 安装完成后重启Microsoft Visual Studio 2010,可以看到下图: 小注: 只有该解决方案已经打开项目的时候,才会看到下面两项: 2、安装protobuf_net(在Nuget中找到prot…

    2025年12月17日 好文分享
    000
  • C# 文件流压缩解压

    /// /// 文件流压缩解压 /// public class ZipHelper { public static int BEST_COMPRESSION = 9; public static int BEST_SPEED = 1; public static int DEFAULT_COMPR…

    好文分享 2025年12月17日
    000
  • C# DataSet性能最佳实践

    c# 性能优化细节 1、使用ItemArray实现对DataRow的批量赋值 在对DataRow的所有字段赋值时,使用字段名进行逐列赋值效率较低。这时应尽量使用批量字段赋值。可以使用ItemArray或rows.Add方法: / ds是数据集(DataSet)对象DataTable dt = ds.…

    好文分享 2025年12月17日
    000
  • C# 字符串操作–减少垃圾回收压力

    c# 性能优化细节 1、使用string.Empty给一个空字符串变量赋初始值 String.Empty是一个指代,而””是具体的实现 string filter=“”;//不建议 string filter=string.Empty; //建议 2、使用str.Length == 0做空串比较 最…

    好文分享 2025年12月17日
    000
  • C# 异常处理(Catch Throw)IL分析

    1、catch throw的几种形式及性能影响: private void Form1_Click(object sender, EventArgs e) { try { } catch { throw; } } private void Form1_Load(object sender, Even…

    2025年12月17日
    000
  • C# SQLite数据库 访问封装类

    在客户端配置文件节点下,添加: 其中【localdb】是本地SQLite数据库的名称,【config/local.db】是在当前程序运行目录下SQLite数据库位置 C# SQLite数据库  访问封装类代码: /// /// 本类为SQLite数据库帮助静态类,使用时只需直接调用即可,无需实例化 …

    好文分享 2025年12月17日
    000
  • C# DataRow 比较

    /// /// dataRow比较 /// /// /// /// 需要比较的列名称 /// public static bool DataRowCompare(DataRow drA, DataRow drB, string[] columnNames) { bool flag = false; …

    好文分享 2025年12月17日
    000
  • C#基础知识整理:基础知识(5) 方法的重载

        老师都有讲课这个方法,一个老师先是在西部偏远山区,是站在教室里木头的黑板前讲课;过了几年表现好,调到了稍微好点的城市里,是坐在教室前用多媒体设备讲课;又过了几年考博士了,毕业后继续当老师,不过现在是躺在家里对着电脑远程授课。都是讲课这个方法,不同的条件下(参数不同)有不同的执行过程和输出结果…

    2025年12月17日
    000
  • C#基础知识整理:基础知识(6) 抽象类和抽象方法

    在实际项目中,当我们设计一个父类时,经常会遇到这个类不能确定它的具体执行流程的。比如我设计一个文件类: public class AFile { private string name = string.Empty; private string path = string.Empty; priva…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:基础知识(7) 方法的隐藏

    继承和抽象类中提到过,子类与父类的方法间有这些关系:子类直接使用父类方法(但是必须父类方法是public或protected类型);子类的方法覆盖父类方法(override);子类的方法重载父类方法(overload);看下面这种情况: public class YSchool { private …

    2025年12月17日
    000
  • C#基础知识整理:基础知识(8) 接口

        前面接触了抽象类,它的特点是子类必须实现abstract修饰的方法。以及还有virtual修饰的方法,virtual修饰的方法子类可以重写也可以不重写而直接使用。但是由于c#也是单继承的,所以定义一个父类,然后继承来扩展一些类的时候,会遇到不合适的情况。因为我们程序员是用程序语言来描述世界的…

    好文分享 2025年12月17日
    000
  • C#基础知识整理:基础知识(9) 接口的应用

        前面接触过接口的概念,其实接口就是一组方法、属性,然后谁继承了它,谁就要实现这组方法和属性。也就是说这个类具备了这个接口定义的一些能力。    接口的这种特性在平常的程序编写中是有很大作用的,往往完成一个大项目需要很多人同时完成,这样难免会有一些类都需要某些方法,而且执行流程都差不多。这是在…

    2025年12月17日
    000
  • C#基础知识整理:基础知识(10) 静态

        如果想访问某个类的方法或属性,一定要先实例化该类,然后用该类的对象加.号访问。比如:有一个用户类和一个处理密码(加密和解密)的类。没生成一个用户实例后,处理密码类要对密码进行加密和解密。 using System;using System.Collections.Generic;using …

    2025年12月17日
    000
  • C#基础知识整理:基础知识(11) 值类型,引用类型

    c#是面向对象的语言,在面向对象的思想中,只有对象,所有事物都可以用类描述。所以比如这些,int,bool,char,string,double,long等都是类,那么像,30,2.5,”test”都是对应类的一个对象。 static void Main(string[] a…

    2025年12月17日
    000
  • C#基础知识整理:基础知识(12) 超类Object

        面向对象三大特性:封装,继承,多态。那么类是从哪里继承呢?在面向对象语言中有基类或者也叫做超类的概念,也就是所有类都是从这个类继承得来的,这个超类叫object。.net中是这样描述object类的:    支持 .net framework 类层次结构中的所有类,并为派生类提供低级别服务。…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信