• 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=0;i<operation.Length;i++)

    {

    Console.WriteLine("执行第{0}个委托方法",i);

    for(int j=1;j<10;j++)

    {

    MathOperation.Process(operation[i],i,j);

    Thread.Sleep(20);

    }

    }

    三、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=0;i<operation.Length;i++)

    {

    Console.WriteLine("执行第{0}个委托方法",i);

    for(int j=1;j<10;j++)

    {

    MathOperation.Process(operation[i],i,j);

    Thread.Sleep(20);

    }

    }

    四、员工工资排序实例

    首先定义一个员工类

    public class Empolyee

    {

    ///姓名

    public string Name{get;set;}

    public decimal Salary{get;set;}

    public Empolyee(string name,decimal salary)

    {

    this.Name=name;

    this.Salary=salary;

    }

    ///重构

    public override string ToString()

    {

    return string.Format("{0}的工资为:{1}",Name,Salary);

    }

    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)

    {

    ///冒泡排序

    bool result=true;

    do{

    result=false;

    for(var i=0;i<arrList.Count-1;i++)

    {

    if(var i=0;i<arrList.Count-1;i++)

    {

    T temp=arrList[i];

    arrList[i]=arrList[i+1];

    arrList[i+1]=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());

    }

  • 相关阅读:
    ReactiveCocoa 谈谈RACMulticastConnection
    ReactiveCocoa 谈谈concat
    Swift 一些环境配置
    hpple 简单使用
    Swift 学习手记1,pod 的 类库使用
    [转]SQL语句:Group By总结
    Jquery VailDate初探
    C#RSA加密解密详解
    电子印章制作管理系统 -升级版本
    tensorflow 实现的第一个目标检测模型
  • 原文地址:https://www.cnblogs.com/zzp0320/p/7059154.html
Copyright © 2020-2023  润新知