一、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#中的委托(二)的更多相关文章

  1. C#中的委托和事件(二)

    引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...

  2. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

  3. C#中的委托(delegate)(个人整理)

    Delegate 一.什么是委托? 委托是一种引用类型,它是函数指针的托管版本.在C#中,委托是一种可以把引用存储为函数的类型.委托可以引用实例和静态方法,而函数指针只能引用静态方法.委托的声明非常类 ...

  4. 面试问题 ---C#中的委托

    一.C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当 ...

  5. c#中的多态 c#中的委托

    C#中的多态性          相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性 ...

  6. 彻底搞清楚c#中的委托和事件

    一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:“委托和事件有何异同?”.如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委 ...

  7. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  8. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  9. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  10. C# 中的委托和事件(转载)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

随机推荐

  1. HDU3625(SummerTrainingDay05-N 第一类斯特林数)

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. SPOJ7001(SummerTrainingDay04-N 莫比乌斯反演)

    Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...

  3. 在学习使用webpack中遇到的错误

    1.局部安装webpack之后使用node_modules/.bin/webpack app/main.js public/bundle.js命令报错      解决方法:      webpack版 ...

  4. Expo大作战(二十四)--expo sdk api之Accelerometer

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. TestLink笔记(一):环境配置+安装

    注:转载请加上原文链接,谢谢! 本文的安装环境是Windows操作系统. (一)     前期准备 1.XAMPP下载(下载5.6的版本) https://www.apachefriends.org/ ...

  6. 《JavaScript面向对象编程指南》

    第一章.引言 1.5 面向对象的程序设计常用概念 对象(名词):是指"事物"在程序设计语言中的表现形式. 这里的事物可以是任何东西,我们可以看到它们具有某些明确特征,能执行某些动作 ...

  7. 想涨工资吗?那就学习Scala,Golang或Python吧

    [编者按]据薪水调查机构 PayScale 提供的数据显示,掌握 Scala,Golang 和 Python 语言以及诸如 Apache Spark 之类的大数据技术,能带来最大的薪水提升.本文作者为 ...

  8. 结合 Redis 实现同步锁

    1.技术方案 1.1.redis的基本命令 1)SETNX命令(SET if Not eXists) 语法:SETNX key value 功能:当且仅当 key 不存在,将 key 的值设为 val ...

  9. MySQL5.6锁阻塞分析

    日常维护中,经常会碰到线程被阻塞,导致数据库响应非常慢,下面就看看如何获取是哪个线程导致了阻塞的. blog地址:http://blog.csdn.net/hw_libo/article/detail ...

  10. django -- Celery实现异步任务

    1. 环境 python==2.7 djang==1.11.2 # 1.8, 1.9, 1.10应该都没问题 celery-with-redis==3.0 # 需要用到redis作为中间人服务(Bro ...