一、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. 【奇技淫巧】绕过waf写文件

    今天偶然利用此命令干成了大事,老司机一看就懂命令用法百度搜到的,希望对各位表哥有用echo 48 65 6C 6C 6F 2C 57 6F 72 6C 64 21 >hex.txt::生成 he ...

  2. vue实现倒计时的插件 时间戳 刷新 跳转 都不影响

    工作当中需要开发一个倒计时插件,于是开始网上先拿来主义,发现好多倒计时的插件,刷新都会变成从头再来,于是自己用vue2.0写了一个插件,测试已经通过,直接上代码 如下是组件代码: <templa ...

  3. PDO中的预处理

    PDO中的基本的原理和步骤和MySQL中的预处理都是一样的,只不过就是把MySQL中的预处理所有命令行的语法封装成了PDO对象的几个公开的方法而已! 1.发送预处理语句 此时,我们需要调用pdo对象的 ...

  4. php 实现简单购物车功能(2)

    上一篇的时候只是写了简单的加入购物车功能,购物车中产品的删除.提交订单后,库存的减少 以及客户账户的余额都没有完善, 这一篇是接着完善上一篇的,上一篇写到了购物车中删除的功能了,为了使删除的代码少敲一 ...

  5. 通过代码动态创建Windows服务

    开发完Windows服务后,一般通过如下命令进行注册Windows服务 @echo off %SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\inst ...

  6. 如何在单元测试时隔离ORM

    在项目中需要对DAL层进行单元测试,如果直接操作数据库,首先测试速度会大大下降,而且让单元测试直接使用外部依赖,很可能带来后续维护的不便,所以有必要对数据库隔离,然后单独测试DAL层.由于使用了ORM ...

  7. 腾讯TBS X5 WebView的简单使用

    工作中经常涉及H5网页的加载工作,最多使用的就是安卓系统控件WebView,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久,体验很差. 那能不 ...

  8. 重学C语言---02C语言概述

    1.第一个C语言实例 #include<stdio.h> int main(void) /*一个简单的C程序*/ { int num; /*定义一个num的变量*/ num = ; /*为 ...

  9. Prometheus Node_exporter 之 Network Netstat

    Network Netstat /proc/net/netstat 1. Netstat IP In / Out type: GraphUnit: shortLabel: Datagrams out ...

  10. guid是否为空的判断

    Guid类型的变量不会为空,初始化没有赋值的GUID应该是00000000-0000-0000-0000-000000000000 . 正确的判断应该是if(Guid testId== Guid.Em ...