C#:委托基础与事件

通过以下思维导图,学习委托的基本概念,后面着重讲解委托的运用,希望通过最简单的方式收获更多的知识。

1.委托的各种写法

1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);

2、委托 委托名 =会调用的方法名; 委托名(参数);

3、匿名方法:委托 委托名=delegate(参数){会调用的方法体};委托名(参数);

4、拉姆达表达式:委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);

5、用Action<T>和Func<T>

Action<参数1, 参数2,> 委托名= ((参数1,参数2) => {不带返回值的方法体 });委托名(参数1,参数2);

Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);

示例:

public delegate int Call(int num1, int num2);
class SimpleMath
{// 乘法方法public static int Multiply(int num1, int num2){return num1 * num2;}// 除法方法public int Divide(int num1, int num2){return num1 / num2;}
}class Test
{static void Main(string[] args){//--------------------第一种写法------------------------//Call objCall = new Call(SimpleMath.Multiply);Call objCall1 = new Call(new SimpleMath().Divide);//--------------------第二种写法------------------------//Call objCall = SimpleMath.Multiply;Call objCall1 = new SimpleMath().Divide;//--------------------第三种写法------------------------//Call objCall = delegate(int a, int b){return a * b;};Call objCall1 = delegate(int a, int b){return a / b;};//--------------------第四种写法------------------------//Call objCall =((int a,int b)=> { return a*b;});Call objCall1 = ((int a, int b) => { return a / b; });//--------------------第五种写法------------------------//Func<int, int, int> objCall = ((a, b) => { return a * b; });Func<int, int, int> objCall1 = ((a, b) => { return a / b; });Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });ob(5, 3);//----------------------------------------------------//int result = objCall(5, 3);int result1 = objCall1(5, 3);System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);Console.ReadKey();}
}

2.委托的运用

委托的运用记住两点:

1.将方法当作参数实例化委托对象;

 2.将方法的参数传递给委托对象,以实现实际的方法调用。

委托常用场景:

1.模板方法:

 如以下定义类CalculateFactory,用于定义各种计算方法,然后通过Calculate方法暴露出来给外界使用,而Calculate方法通过传入委托对象new Calculate(x1.Add)来实现对Add方法的调用。这是委托模板方法使用较简单的一种形式,它还可以有很多变种。

  下面这段程序不用委托完全可以实现同样的逻辑,为什么要“故弄玄虚”呢?因为示例是为了说明委托作为模板方法的用法,故而用了最简单的一种,实际运用过程中,通常与设计模式相结合,以实现代码的高复用低耦合。进一步延伸,实际设计模式中也较少用委托,而用接口、抽象类来实现“模板方法”的功能,具体要怎么用是看个人习惯和便捷程度。委托用的最多的场景是下面要介绍的回调方法。

class Program{static void Main(string[] args){CalculateFactory x1 = new CalculateFactory();CalculateFactory x2 = new CalculateFactory();x1.Calculate(10, 9, new Calculate(x1.Add));x2.Calculate(10, 9, new Calculate(x2.Reduce));Console.ReadKey();}}public delegate void Calculate(int a, int b);public class CalculateFactory{public void Calculate(int a, int b, Calculate calculateDelegae){calculateDelegae(a, b);}public void Add(int a, int b){Console.WriteLine(string.Format("This is a+b={0}", a + b));}public void Reduce(int a, int b){Console.WriteLine(string.Format("This is a-b={0}", a - b));}}

2.回调方法:

  回调方法与模板方法并不是并列的两种类型,其本质都是一样的,即将方法当成参数传递并调用,是通过应用场景来分类的。主调方法(调用回调方法的方法体)在满足某种条件或完成某种逻辑后去调用的方法,称为回调方法。将上面示例改造成含有回调方法的程序。

class Program{static void Main(string[] args){ProductFactory productFactory = new ProductFactory();WrapFactory wrapFactory = new WrapFactory();Func<Product> func1 = new Func<Product>(productFactory.MakePizza);Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);Logger logger = new Logger();Action<Product> log = new Action<Product>(logger.Log); //Log的委托;Box box1 = wrapFactory.WrapProduct(func1, log);Box box2 = wrapFactory.WrapProduct(func2, log);Console.WriteLine(box1.Product.Name);}class Product //产品类{public string Name { get; set; }public double Price { get; set; }}class Box //盒子类{public Product Product { get; set; }}class Logger{public void Log(Product product){Console.WriteLine(product.Price);}}class WrapFactory  //包装工厂{public Box WrapProduct(Func<Product> getProduct, Action<Product> logCallback){Box box = new Box();Product product = getProduct.Invoke();//此处使用的是间接的同步调用,如果使用间接异步调用用BeginInvoke();if (product.Price > 50) //如果产品价格大于50,就执行回调方法;{logCallback(product);}box.Product = product;return box;}}class ProductFactory  //产品工厂{public Product MakePizza(){Product product = new Product();product.Name = "Pizza";product.Price = 30;return product;}public Product MakeToyCar(){Product product = new Product();product.Name = "ToyCar";product.Price = 100;return product;}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git Bash关键命令

1.默认目录是C:\Users\用户名 2.切换目录&#xff1a;$cd c:\\windows 3.切换到上级目录&#xff1a;cd ..&#xff0c;中间有空格 4.列出某目录所有文件&#xff0c;相当于DOS下的dir&#xff1a;ls c:\\windows 5.查看配置信息&#xff1a;git config --list 以下是显示信息 …

C#:invoke 与 BeginInvoke使用区别

invoke和begininvoke 区别 一直对invoke和begininvoke的使用和概念比较混乱&#xff0c;这两天看了些资料&#xff0c;对这两个的用法和原理有了些新的认识和理解。 首先说下&#xff0c;invoke和begininvoke的使用有两种情况&#xff1a; 1. control中的invoke、begininvoke。…

Django基本命令

Django基本命令 1.创建一个Django 项目 django_admin.py startproject mysite当前目录下会生成mysite的工程&#xff0c;目录结构如下&#xff1a; manage.py ----- Django项目里面的工具&#xff0c;通过它可以调用django shell和数据库等。settings.py ---- 包含了项目的默认…

Git忽略规则.gitignore梳理

对于经常使用Git的朋友来说&#xff0c;.gitignore配置一定不会陌生。废话不说多了&#xff0c;接下来就来说说这个.gitignore的使用。首先要强调一点&#xff0c;这个文件的完整文件名就是".gitignore"&#xff0c;注意最前面有个“.”。 一般来说每个Git项目中都需…

第二周CoreIDRAW课总结

1.这节课学到了什么知识&#xff1f; 学到了图像的复制&#xff0c;再制鼠标复制&#xff0c;重复&#xff0c;还有对象的对齐&#xff0c;对象的分布顺序。 2.有哪些心得体会&#xff1f; 做了课本的练习&#xff0c;会用窗口里面的泊坞窗造型命令也作出了一个作品。 3.这节课…

axios关于针对请求时长策略设计的思考

前言 在我们的业务请求中&#xff0c;有很多时候会针对有不同时长的需求策略性设置。这里针对这个需求进行详细的展开。 针对这种情况&#xff0c;我们的timout的一般是根据请求地址来的&#xff0c;所以核心处理技巧便是如何根据不同的request地址去设置不同的timeout. 我们之…

C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

方法一&#xff1a;直接通过修改窗体位置从而达到移动窗体的效果 方法二&#xff1a;直接伪装发送单击任务栏消息&#xff0c;让应用程序误以为单击任务栏从而移动窗体 方法一 1.定义一个位置信息Point用于存储鼠标位置 private Point mPoint; 2.给窗体等控件增加MouseDown…

Python 字典删除元素clear、pop、popitem

同其它python内建数据类型一样&#xff0c;字典dict也是有一些实用的操作方法。这里我们要说的是字典删除方法&#xff1a;clear()、pop()和popitem()&#xff0c;这三种方法的作用不同&#xff0c;操作方法及返回值都不相同。接下来就来查看下这些字典特定方法的具体用法是什么…

reactor模式:多线程的reactor模式

上文说到单线程的reactor模式 reactor模式&#xff1a;单线程的reactor模式 单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题&#xff0c;所以多线程的reactor模式引入线程池的概念&#xff0c;把耗时的IO操作交由线程池处理&#xff0c;处理完了之后再同步到selecti…

Elasticsearch实战篇——Spring Boot整合ElasticSearch

2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行&#xff0c;包括我自己&#xff0c;也是在用Spring Boot集成其他框架进行项目开发&#xff0c;所以这一节&#xff0c;我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容…

C#:Dockpanel的一些入门的基本操作

原文链接&#xff1a; 一、引用&#xff1a; 1.建立一个WinForm工程&#xff0c;默认生成了一个WinForm窗体Form1&#xff08;此处默认为主窗体&#xff09;。 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。 3.设置Form1窗体属性IsMdiContainer…

MyBatis中if,where,set标签

<if>标签 <select id"findActiveBlogWithTitleLike"resultType"Blog">SELECT * FROM BLOG WHERE state ‘ACTIVE’ <if test"title ! null">AND title like #{title}</if> </select> if标签通常伴随着where,set…

Python3基础 __repr__ 类的实例对象的名字 可以打印文字(1)

引用自&#xff1a;http://www.bubuko.com/infodetail-1918622.html 这个__repr__的作用从下边的例子中可以看出,返回实例化对象的表达 code: class MyClass() :def __str__(self) :return "我是MyClass的一个实例"def __repr__(self) :return "这回连print都省…

Day03:文件打开;错误处理

错误处理 try: #要执行的代码 except 错误的类型&#xff08;可选&#xff09;: #发生错误时执行的代码 finally: #有没有发生错误都执行的代码 复制代码with open() as 变量名&#xff1a; with提供一种叫上下文管理协议的python技术&#xff0c;系统会自动关闭文件 open() 默…

Python: pip升级报错了:You are using pip version 10.0.1, however version 20.3.3 is available.

1,Python使用命令&#xff1a;python -m pip install --upgrade pip升级pip的时候报了下面这个错 2,换了个命令&#xff1a; python -m pip install --upgrade pip -i https://pypi.douban.com/simple 更新成功了&#xff0c;但又报了一个新的错误&#xff1a; AttributeError:…

新手上路之Hibernate:第一个Hibernate例子

一、Hibernate概述 &#xff08;一&#xff09;什么是Hibernate&#xff1f; Hibernate核心内容是ORM&#xff08;关系对象模型&#xff09;。可以将对象自动的生成数据库中的信息&#xff0c;使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库&…

模板标签及模板的继承与引用

1.常用的模板标签 - 作用是什么:提供各种逻辑 view.py: def index(request):#模板标签 --常用标签 总结&#xff1a;语法 {% tag %} {% endtag %} {% tag 参数 参数 %} 示例 展示页index.html&#xff0c;包含for标签&#xff0c;if标签&#xff0c;url标签 {% extends teacher…

文件夹操作之创建

创建文件夹可通过Directory类的CreateDirectory方法来实现格式为&#xff1a;Directory.CreateDirectory(“文件路径”)&#xff1b;String path“C:\Users\Administrator\Desktop\51zxw”&#xff1b; If&#xff08;Directory.exists&#xff08;path&#xff09;&#xff09…

doxygen

http://www.doxygen.nl/转载于:https://www.cnblogs.com/zengkefu/p/7383793.html

C#:RichTextBox 追加其它颜色的行列

1、新建静态扩展方法public static class RichTextBoxExtension{public static void AppendTextColorful(this RichTextBox rtBox, string text, Color color, bool addNewLine true){if (addNewLine){text Environment.NewLine;}rtBox.SelectionStart rtBox.TextLength;rtB…