C#中的委托(二)
一、Action<T>和Func<T>委托
除了上篇描述的为每个参数和返回类型定义一个新委托类型之外,还可以使用Action<T>和Func<T>委托。通过T的标示,我们可以知道这是两个泛型委托。
二、Action<T>
其中Action<T>委托表示引用一个void返回类型的方法。这个委托存在不同的变体,可以传递最多16种不同的参数类型。如:Action<in T1>表示调用带一个参数的方法(返回类型为void),Action<in T1,in T2>表示两个参数,Action<in T1.....in T16>表示16个参数(最多16个);在这就以上篇中数据操作类,加以改造:
public class MathOperation
{
public static void Add(int x, int y)
{
int result = x + y;
Console.WriteLine("x+y={0}", result);
} public static void Reduce(int x, int y)
{
int result = x - y;
Console.WriteLine("x-y={0}", result);
} public static void Process(Action<int, int> action, int x, int y)
{
action(x, y);
}
}
执行代码:
Action<int, int>[] operation = {
MathOperation.Add,
MathOperation.Reduce
};
for (int i = ; i < operation.Length; i++)
{
Console.WriteLine("执行第{0}个委托方法", i);
for (int j = ; j < ; j++)
{
MathOperation.Process(operation[i], i, j);
Thread.Sleep();
}
}
输出结果:

三、Func<T>
Func<T>调用带返回类型的方法。与Action<T>类似,Func<T>也定义了不同的变体,至多可以16个参数类型和一个返回类型。Func<out TResult>委托类型可以调用带返回类型且无参的方法,Func<in T,out TResult>表示带有一个参数的方法。我们继续在数据操作类上改造:
public class MathOperation
{
public static int Add(int x, int y)
{
int result = x + y;
return result;
} public static int Reduce(int x, int y)
{
int result = x - y;
return result;
} public static void Process(Func<int, int, int> action, int x, int y)
{
int result = action(x, y);
Console.WriteLine("执行结果为:{0}", result);
}
}
执行代码:
Func<int, int,int>[] operation = {
MathOperation.Add,
MathOperation.Reduce
};
for (int i = ; i < operation.Length; i++)
{
Console.WriteLine("执行第{0}个委托方法", i);
for (int j = ; j < ; j++)
{
MathOperation.Process(operation[i], i, j);
Thread.Sleep();
}
}
执行结果:

四、员工工资排序实例
首先定义一个员工类
public class Empolyee
{
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; } /// <summary>
/// 工资
/// </summary>
public decimal Salary { get; set; } public Empolyee(string name, decimal salary)
{
this.Name = name;
this.Salary = salary;
} /// <summary>
/// 重构
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("{0}的工资为:{1}", Name, Salary);
} /// <summary>
/// 定义一个比较员工工资的静态方法(用于向通用排序类传值)
/// </summary>
/// <param name="e1"></param>
/// <param name="e2"></param>
/// <returns></returns>
public static bool CompareTo(Empolyee e1, Empolyee e2)
{
return e1.Salary < e2.Salary;
}
}
然后创建一个排序类:
public class SortUtil
{
public static void Sort<T>(IList<T> arrList, Func<T, T, bool> compare)
{
////冒泡排序
//for (int i = 0; i < arrList.Count - 1; i++)
//{
// for (int j = i + 1; j < arrList.Count - 1; j++)
// {
// if (compare(arrList[i], arrList[j]))
// {
// var temp = arrList[i];
// arrList[i] = arrList[j];
// arrList[j] = temp;
// }
// }
//} bool result = true;
do
{
result = false;
for (var i = ; i < arrList.Count - ; i++)
{
if (compare(arrList[i], arrList[i + ]))
{
T temp = arrList[i];
arrList[i] = arrList[i + ];
arrList[i + ] = temp;
result = true;
}
}
}
while (result); }
}
执行代码:
Empolyee[] list = {
new Empolyee("A",12.3M),
new Empolyee("B",12.4M),
new Empolyee("C",12.2M),
new Empolyee("D",12.5M),
new Empolyee("E",12.1M)
};
SortUtil.Sort<Empolyee>(list, Empolyee.CompareTo);
foreach (var item in list)
{
Console.WriteLine(item.ToString());
}
执行结果:

C#中的委托(二)的更多相关文章
- C#中的委托和事件(二)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
- C#中的委托(delegate)(个人整理)
Delegate 一.什么是委托? 委托是一种引用类型,它是函数指针的托管版本.在C#中,委托是一种可以把引用存储为函数的类型.委托可以引用实例和静态方法,而函数指针只能引用静态方法.委托的声明非常类 ...
- 面试问题 ---C#中的委托
一.C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当 ...
- c#中的多态 c#中的委托
C#中的多态性 相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性 ...
- 彻底搞清楚c#中的委托和事件
一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:“委托和事件有何异同?”.如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委 ...
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- Objective-C中的委托(代理)模式
我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
随机推荐
- Liunx下配置网络
1.首先查看一下自己的网络 ifconfig 我查看之后发现....没有eth0 ok,现在去 /etc/sysconfig/network-scripts 目录中查看是否有 ifcfg-et0 文件 ...
- MongoDB -的连接和使用
MongoDB 的 连接使用 在节我们将讨论 MongoDB 的不同连接方式. 启动 MongoDB 服务 在前面的,我们已经讨论了如何启动 MongoDB 服务,你只需要在 MongoDB 安装目录 ...
- HTML:target=_blank、target=_top、target=_parent、target=_self 的区别
HTML:target=_blank.target=_top.target=_parent.target=_self 的区别 _blank 在新窗口中打开链接_parent 在父窗体中打开链接_sel ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 2
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 1------------------- 建立如下数据表 CREATE ...
- Expo大作战(二十七)--expo sdk api之Util(expo自带工具类),tackSnapshotAsync,Svg,SQLite
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- [Android] TableLayout
public class TableLayout extends LinearLayout 查过文档,整理下要点: 一个 TableLayout 包含一些 TableRow 对象,每个对象代表一行.除 ...
- 10分钟让你明白MySQL是如何利用索引的
一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL ...
- 转:检查c#代码内存泄露工具-CLR Profiler工具使用
大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露.内存持续增长得不到释放等问题导致APS.NET网站 ...
- Python新建/删除文件夹
新建以当前日期为名的文件夹 import datetime,os,shutil today = datetime.datetime.now().date().strftime('%Y%m%d') pa ...
- python基础学习6----字符串操作
一.重复输出字符串 print('hello'*20)#输出20个hello 二.通过索引获取字符串中字符 print('helloworld'[2:])#输出lloworld 三.关键字 in pr ...