C#委托、Func、Action、匿名

委托的定义

delegate void MyDelegate(int x); //加参数

在本示例中,定义了一个委托MyDelegate,并指定该委托的每一个实例都可以包含一个方法的引用,该方法带有一个int参数,并且返回值为void

使用代码如下:

class Program
{
    delegate void MyDelegate(int x);

    static void Main(string[] args)
    {
        MyDelegate mDeg = Program.PrintX;
        mDeg(12); //输出12
    }
    static void PrintX(int x)
    {
        Console.WriteLine(x);
    }
}

Func<T>

Func<T>用于带参数的返回值方法。

public delegate TResult Func<in T1,in T2, out TResult>(T1 arg1,T2 arg2);

  • T1
    委托封装方法的第一个参数类型。此类型是逆变的,即可以使用指定的类型或者派生程度更低的类型。
  • T2
    委托封装的方法的第二个参数类型。
  • TResult
    委托封装方法的返回值类型。此类型是协变的,即可以使用指定的类型或者派生程度更低的类型。
  • arg1,arg2
    委托封装的方法的两个参数。

示例代码如下:

class Program
{
    static void Main(string[] args)
    {
        Func<int,int,int> doAdd = Program.Addition; //使用+=会覆盖前一个委托
        Console.WriteLine(doAdd(3,4));
    }
    static int Addition(int x,int x)
    {
        return x+y;
    }
}

Action<T>

Action<T>委托表示引用一个返回值为void类型的方法。可用于多播。

实例代码如下:

class Program
{
    static void Main(string[] args)
    {
        Action<int> operations = Program.MyMultiply;
        operations += Program.MyAdd;
        operations(3,4);
    }
    static void MyMultiply(int x,int x)
    {
        Console.WriteLine(x*y);
    }

    static void MyAdd(int x,int x)  
    {
        Console.WriteLine(x+y);
    }
}

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

封装一个方法,该方法具有两个参数并且不返回值。

  • T1
    委托封装方法的第一个参数类型。此类型是逆变的,即可以使用指定的类型或者派生程度更低的类型。
  • T2
    委托封装的方法的第二个参数类型。
  • arg1,arg2
    委托封装的方法的两个参数。

匿名方法委托

  • 实现一
class Program
{
    delegate void Square(int x);
    static void Main(string[] args)
    {
        Square myS = delegate(int x)
        {
            Console.WriteLine(x*x);
        };
        myS(10);
    }
}
  • 实现二
class Program
{
    static void Main(string[] args)
    {
        string say = "Hello,";
        Func<string,string> sayHello = delegate(string str)
        {
            return str += "Mr.5";
        };
        Console.WriteLine(sayHello(say));
    }
}

猜你喜欢

转载自blog.csdn.net/yirol_/article/details/81236277