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#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
随机推荐
- ubuntu 17.10 安装后的应用软件安装
目录 安装 sogou 拼音 安装markdown编辑器 安装codeblocks 下载工具uGet+aira2 安装QT 安装remarkable(markdown工具) 安装StarUML(UML ...
- Java中List、integer[]、int[]之间的转化
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- RaPC栅格化多边形裁剪之——进化0.1
采用整数二维数组进行cell的归属标记,将所有符合条件的cell输出,不进行整体多边形重构,用以统计面积. 上图: INTERSECT: 网格区域为离散化的空间范围,黄色部分为求交结果. differ ...
- 大数据【一】集群配置及ssh免密认证
八月迷情,这个月会对大数据进行一个快速的了解学习. 一.所需工具简介 首先我是在大数据实验一体机上进行集群管理学习,管理五台实验机,分别为master,slave1,slave2,slave3,cli ...
- Django 序列化三种方式 对象 列表 元组
1.xuliehua.html <html lang="en"> <head> <meta charset="UTF-8"> ...
- 控制台输出 mybatis 中的sql语句
控制台输出 mybatis 中的sql语句 在 log4j.xml 文件中 增加如下配置 <!-- mybatis 输出的sql,DEBUG级别 --> <logger name=& ...
- yum 私有仓库
参考地址:https://blog.oldboyedu.com/autodeploy-yum YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具 ...
- Hadoop HBase概念学习系列之HBase里的HRegion(五)
首先,要区分,HRegion服务器包含两大部分:HLog部分和HRegion部分 HBase里的HRegion服务器 HBase里的HRegion 当表的大小超过设置值的时候,HBase会自动将表划 ...
- UI中新增一个右击按钮的过程
1.首先给出增加之后的成品 点击后的界面 3.需要增加的部分 新增一个类:DiglogAddUser 用于操作用户填写的数据,写入数据库等操作 3.1首先在资源文件中定义窗口代号 3.2 枚举出该代 ...
- 详解--从地址栏输入url到页面展现中间都发生了什么?
这是一个综合性很强的问题,个人理解包含以下七个基本点: 1.在浏览器地址栏输入url并按下回车. 2.浏览器检查当前url是否存在缓存和缓存是否过期. 3.域名解析(DNS解析url对应的ip). 4 ...