C#委托基础
委托和其委托的方法必须具有相同的签名。签名相同:1.参数类型相同 2.参数数量相同 3.返回值一致
例一
- class Program
- {
- public delegate int MathMethod(int x, int y);
- public int Add(int a, int b)
- {
- return a + b;
- }
- static void Main(string[] args)
- {
- MathMethod mm;
- Program p = new Program();
- mm = p.Add;// 相当于一个方法的容器
- Console.WriteLine("计算结果为{0}",mm(7,6));
- Console.ReadLine();
- }
- }
例二
- class Program
- {
- public delegate double MathMethod(double x, double y);
- double Add(double a, double b)
- {
- return a + b;
- }
- double Subtract(double a, double b)
- {
- return a + b;
- }
- double Multiply(double a, double b)
- {
- return a * b;
- }
- double Divide(double a, double b)
- {
- return a / b;
- }
- void DoCalculate(MathMethod mm)
- {
- Console.WriteLine("请输入第一个数");
- double x = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("请输入第二个数");
- double y = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("结果{0}",mm(x, y));
- Console.ReadLine();
- }
- static void Main(string[] args)
- {
- MathMethod mm;
- Program p = new Program();
- mm = p.Divide;
- p.DoCalculate(mm);
- }
- }
-----------------------------------------------------------
多路委托
- class Program
- {
- public delegate void SayThingToS(string s);
- void SayHello(string s)
- {
- Console.WriteLine("你好{0}", s);
- }
- void SayGoodBye(string s)
- {
- Console.WriteLine("再见{0}", s);
- }
- static void Main(string[] args)
- {
- // 方式一
- SayThingToS say1, say2, say3, say4;
- Program p = new Program();
- say1 = p.SayHello;
- say1("xy"); // 你好xy
- say2 = p.SayGoodBye;
- say2("xy"); // 再见xy
- say3 = say1 + say2;
- say3("xy"); // 你好xy,再见xy
- say4 = say3 - say1;
- say4("xy"); // 再见xy
- // 方式二
- SayThingToS s1 = new SayThingToS(p.SayHello);
- s1 += new SayThingToS(p.SayGoodBye);
- s1("xy"); // 你好xy,再见xy
- SayThingToS s2 = new SayThingToS(p.SayHello);
- s2 += new SayThingToS(p.SayGoodBye);
- s2 -= new SayThingToS(p.SayHello);
- s2("xy"); // 再见xy
- }
- }
-----------------------------------------------------------
泛型委托
- class Program
- {
- // 泛型委托,与普通委托类似,不同之处只在于使用泛型委托要指定泛型参数
- public delegate T MyGenericDelegate<T>(T obj1,T obj2);
- int AddInt(int x, int y)
- {
- return x + y;
- }
- string AddString(string s1, string s2)
- {
- return s1 + s2;
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- MyGenericDelegate<int> intDel;
- intDel = p.AddInt;
- Console.WriteLine("int代理的值是{0}", intDel(100, 200));
- MyGenericDelegate<string> stringDel;
- stringDel = p.AddString;
- Console.WriteLine("string代理的值是{0}", stringDel("aaa", "bbb"));
- }
- }
为了方便开发,.NET基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广,比如在编写lambda表达式和开发并行计算程序时经常要用到他们。就是下面我的几篇博客需要介绍的内容。
-----------------------------------------------------------
为了方便开发,.NET基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广,比如在编写lambda表达式和开发并行计算程序时经常要用到他们。
预定义泛型委托Func
- class Program
- {
- double AddInt(int x, int y)
- {
- return x + y;
- }
- string AddString(string s1, string s2)
- {
- return s1 + s2;
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- // 以为前两个参数为int,他们运行的结果为double,最后一个参数与AddInt返回值一致
- Func<int, int, double> funcInt = p.AddInt;
- Console.WriteLine("funcInt的值为{0}", funcInt(100, 300));
- Func<string, string, string> funcString = p.AddString;
- Console.WriteLine("funcString的值为{0}", funcString("aaa", "bbb"));
- }
- }
-----------------------------------------------------------
为了方便开发,.NET基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广,比如在编写lambda表达式和开发并行计算程序时经常要用到他们
对于函数返回值为空的情形,可以使用Action泛型委托
- class Program
- {
- // 对于函数返回值为空的情形,可以使用Action泛型委托
- void Showstring(string s)
- {
- Console.WriteLine("显示的string值为{0}",s);
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- Action<string> showstring = p.Showstring;
- showstring("xy");
- }
- }
-----------------------------------------------------------
此委托返回一个bool值,该委托通常引用一个"判断条件函数"。
需要指出的是,判断条件一般为“外部的硬性条件”,比如“大于50”,而不是由数据自身指定,不如“查找数组中最大的元素就不适合”。
例一
- class Program
- {
- bool IsGreaterThan50(int i)
- {
- if (i > 50)
- return true;
- else
- return false;
- }
- static void Main(string[] args)
- {
- Program p=new Program();
- List<int> lstInt = new List<int>();
- lstInt.Add(50);
- lstInt.Add(80);
- lstInt.Add(90);
- Predicate<int> pred = p.IsGreaterThan50;
- int i = lstInt.Find(pred); // 找到匹配的第一个元素,此处为80
- Console.WriteLine("大于50的第一个元素为{0}",i);
- List<int> all = lstInt.FindAll(pred);
- for (int j = 0; j < all.Count(); j++)
- {
- Console.WriteLine("大于50的数组中元素为{0}", all[j]); // 找出所有匹配条件的
- }
- Console.ReadLine();
- }
- }
例二
- class Staff
- {
- private double salary;
- public double Salary
- {
- get { return salary; }
- set { salary = value; }
- }
- private string num;
- public string Num
- {
- get { return num; }
- set { num = value; }
- }
- public override string ToString()
- {
- return "Num......" + num + "......" + "......" + "Salary......" + salary;
- }
- }
- class Program
- {
- bool IsSalaryGreaterThan5000(Staff s)
- {
- if (s.Salary > 5000)
- return true;
- else
- return false;
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- List<Staff> allStaff = new List<Staff>
- {
- new Staff{Num="001",Salary=9999.9},
- new Staff{Num="002",Salary=8991},
- new Staff{Num="003",Salary=10000.8},
- new Staff{Num="004",Salary=4999.99}
- };
- Predicate<Staff> s = p.IsSalaryGreaterThan5000;
- Staff theFirstOne = allStaff.Find(s);
- Console.WriteLine(theFirstOne); // 找出第一个
- List<Staff> all = allStaff.FindAll(s);
- for (int i = 0; i < all.Count(); i++)
- {
- Console.WriteLine(all[i]); // 找出所有满足条件的
- }
- Console.ReadLine();
- }
- }
-----------------------------------------------------------
- class Program
- {
- double AddInt(int x, int y)
- {
- return x + y;
- }
- string AddString(string s1, string s2)
- {
- return s1 + s2;
- }
- static void Main(string[] args)
- {
- Program p = new Program();、
- // 以为前两个参数为int,他们运行的结果为double,最后一个参数与AddInt返回值一致
- Func<int, int, double> funcInt = p.AddInt;
- Console.WriteLine("funcInt的值为{0}", funcInt(100, 300));
- Func<string, string, string> funcString = p.AddString;
- Console.WriteLine("funcString的值为{0}", funcString("aaa", "bbb"));
- // 匿名方法
- Func<float, float, float> fucFloat = delegate(float x, float y)
- {
- return x + y;
- };
- Console.WriteLine("funcFloat的值为{0}", fucFloat(190.7F, 99999.9F));
- Console.ReadLine();
- }
- }
-----------------------------------------------------------
- class Program
- {
- double AddInt(int x, int y)
- {
- return x + y;
- }
- string AddString(string s1, string s2)
- {
- return s1 + s2;
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- // 以为前两个参数为int,他们运行的结果为double,最后一个参数与AddInt返回值一致
- Func<int, int, double> funcInt = p.AddInt;
- Console.WriteLine("funcInt的值为{0}", funcInt(100, 300));
- Func<string, string, string> funcString = p.AddString;
- Console.WriteLine("funcString的值为{0}", funcString("xy", "xy"));
- // 匿名方法
- Func<float, float, float> fucFloat = delegate(float x, float y)
- {
- return x + y;
- };
- Console.WriteLine("funcFloat的值为{0}", fucFloat(190.7F, 99999.9F));
- // Lambda表达式
- Func<string, string, string> funString2 = (x, y) => (x + y);
- Console.WriteLine("funString2的值为{0}", funString2("xy", "xy"));
- Console.ReadLine();
- }
- }
-----------------------------------------------------------
例一
- delegate void AppendStringCallback(string text);
- private void AppendString(string txt)
- {
- this.listView1.Items.Add(txt);
- }
- private void ReceiveDate()
- {
- AppendStringCallback appendStringCallback = new AppendStringCallback(AppendString);
- this.Invoke(appendStringCallback, new object[]
- { string.Format("{0},{1},{2}", str1, str2 + "号", iepAddress.ToString()) });
- }
例二
- namespace ThreadPoolDemo
- {
- public partial class ThreadForm : Form
- {
- // 定义delegate以便Invoke时使用
- private delegate void SetProgressBarValue(int value);
- // 跟SetProgressBarValue委托相匹配的方法
- private void SetProgressValue(int value)
- {
- progressBar.Value = value;
- }
- // 使用Invoke方法来设置进度条
- private void RunWithInvoke()
- {
- int value = progressBar.Value;
- while (value< progressBar.Maximum)
- {
- // 如果是跨线程调用
- if (InvokeRequired)
- {
- this.Invoke(new SetProgressBarValue(SetProgressValue), value++);
- }
- else
- {
- progressBar.Value = ++value;
- }
- }
- }
- public ThreadForm()
- {
- InitializeComponent();
- }
- private void btnInvoke_Click(object sender, EventArgs e)
- {
- progressBar.Value = 0;
- Thread thread = new Thread(new ThreadStart(RunWithInvoke));
- thread.Start();
- }
- }
- }
-----------------------------------------------------------
C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客。
本文出自 “IT徐胖子的专栏” 博客,请务必保留此出处http://woshixy.blog.51cto.com/5637578/1070976
C#委托基础的更多相关文章
- C# 委托基础1.0
在C# 1.0中提出了一种新特性叫作:委托.委托本质上一种类型.是对特定方法的抽象,定义委托后,可以将方法封装,把方法当参数,传递 using System; using System.Collect ...
- C#委托基础学习
什么是委托 委托,顾名思义就是在你忙着做另一件事时候,你要去做另一件事,于是你可能就会委托别人帮你做,让别人把结果返回给你.编程时,委托也有这个思想. 我目前对委托的看法是,在编程中,委托 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- ch01.深入理解C#委托及原理(转)
ch01..深入理解C#委托及原理_<没有控件的ASPDONET> 一.委托 设想,如果我们写了一个厨师做菜方法用来做菜,里面有 拿菜.切菜.配菜.炒菜 四个环节,但编写此方法代码的人想让 ...
- c#进阶之浅析委托和事件
何为委托 加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型 public void Write() { //TODO } //加上关键字delegate,去掉方法体{} ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- C#委托的用法 在C#中我想在一个方法中调用另一个按钮的事件,怎样来实现?
最开始我也不清楚,后来我是这样想了. 1.事件和委托不是一个概念,你如果是调用control的事件,可以直接在其对应的事件eventhandler上attach自己的事件方法就好了如:this.But ...
- Aap.Net中的Action和Func委托
前言 最近在阅读某开源框架源码的时候,发现作者在其中运用了很多Action委托和Func委托,虽然我之前在项目中也有一些对委托的实操,但还是免不了长时间的不用,当初消化的一些委托基础都遗忘了...索性 ...
- C# · 委托语句简化演变
1.委托基础语句形式 namespace QLVision { delegate void dHelp();//定义委托 static class Program { /// <summary& ...
随机推荐
- Fire Net(深搜 和一前不一样的深搜)
/* http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162 本题妙处: 用一个数对行取商是 ...
- servlet简介
web 开发分为两种:静态开发(使用html)和动态开发(使用servlet/jsp,jsp就是servlet,ASP ,PHP) 所以servlet是sun公司提供的一门专门用于开发动态web资源的 ...
- 结构性产品 Structured Product
定义 结构性产品是固定收益产品(Fixed Income Instruments)的一个特殊种类.它将固定收益产品(通常是定息债券)与金融衍生交易(如远期.期权.掉期等)合二为一,增强产品收益或将投资 ...
- linux —— 学习笔记(汇总)
笔记目录:一.系统知识 和 基本概念 二.常用操作 三.系统管理(内存.设备.服务等管理) ...
- 必胜宅急送Web app设计背后的思考
O2O模式是餐饮业在移动消费趋势下主动拥抱互联网的方向,迎合餐饮消费者从以往经验判断为主转变为依靠移动设备.lbs.社交网络进行立体决策的过程.继App客户端之后,手机web app也逐渐成为O2O中 ...
- Android 通过反射让SQlite建表如此简单
我们通常使用SQlite的时候,假设我们有10张表,我们要写10个建表语句.而建表语句中仅仅有一些字段的名字须要改而已,这样既费时又费力,还easy出错.我们知道写sql语句的时候常常会写错,假设写错 ...
- 动态规划晋级——POJ 3254 Corn Fields【状压DP】
转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
- Eclipse中使用git把项目导入到osc@git中
方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目: 项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...
- HDU 4442 Physical Examination(关于贪心排序)
这个题目用贪心来做,关键是怎么贪心最小,那就是排序的问题了. 加入给定两个数a1, b1, a2, b2.那么如果先选1再选2的话,总的耗费就是a1 + a1 * b2 + a2; 如果先选2再选1, ...
- 【开源java游戏框架libgdx专题】-05-模块描述与上下文
模块描述(Modules overview) Input:为所有的平台提供一个统一的输入模型和处理程序. 获取触摸示例: if (Gdx.input.isTouched()) { System.out ...