委托的定义
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));
}
}