最近又学习了一些C#的小知识点,在此发布博客记录一下。
一、委托
C#中的委托的关键字是delegate,我们可以使用委托类型来将已有的方法实例化出来,也可以将我们自己定义的方法作为参数来传递。
例如: private delegate string GetAString();//我们定义一个委托类型,这个委托的名字是GetAString
static void Main(string[] args)
{
int x = 40;//定义了一个变量为x,为其赋值为40
GetAString a = new GetAString(x.ToString);//传递一个方法为参数,相当于a指向了x中的ToString方法。
//GetAString a = x.ToString;//第二种赋值方法,直接将方法赋值给委托变量。
string s = a();//通过委托的实例去调用x中的ToString方法。
Console.WriteLine(s);
Console.ReadKey();
}
上面这个例子中,存在两种对委托类型变量a的赋值,第一种方法是直接改变a的指向,将ToString方法作为参数,传递给a,而第二种方法,则是直接将x中的方法赋值给a。这是已有方法ToString利用委托类型实例化出来的例子。下面分享一个自己定义方法作为参数进行委托传递的例子。
例:
private delegate void PrintString();//首先定义一个委托类型
static void PrintStr(PrintString print)//委托类型可以作为参数传递。
{
print();
}
//定义的变量需要初始化才可以使用,所以新创建两个方法,用来初始化method;
static void Method1()
{
Console.WriteLine("method1");
}
static void Method2()
{
Console.WriteLine("method2");
}
static void Main(string[] args) {
PrintString method=Method1;//使用Method1方法来初始化method委托变量
PrintStr(method);//利用定义好的函数PrintStr来输出method方法
method = Method2;//委托类型重新复制,调用参数改变,输出结果也改变
PrintStr(method);
Console.ReadKey();
}
大家可以注意到,我输出了2次method委托变量,但是2次的结果是不同的,因为我们利用赋值的方式,在输出Method1方法后将委托变量的值改变为Method2方法。而这个方法参数,正是我们一开始定义的PrintString委托类型的print方法。
二、Action委托和Func委托
下面说一下C#语言中为我们定义好的两个委托类型:
1、Action委托
这个委托最大的特点是它只能指定没有返回值的方法,也就是void类型的方法,而他传递的方法中可以包含0个或多个参数。也就是说,既没有参数也没有返回值的方法也可以通过Action委托进行传递。
例: static void PrintDoubleInt(int i1, int i2)//我们先定义一个方法,注意它没有返回值
{
Console.WriteLine(i1+i2);
}
static void Main(string[] args)
{
Action<int , int> a=PrintDoubleInt;//我们将方法中的2个参数利用泛型<>来传递。
a(23,33);//然后我们随意在委托变量a中传递两个参数。
Console.ReadKey();
}
这里要注意,Action后面泛型中的类型,一定要与声明此方法中的参数一一对应。然后输出结果为两个int参数的和。
2、Func委托
这个委托跟Action委托正好对应,他是必须要有返回值的委托类型。参数方面与Action委托要求基本一致,可以有0个或多个参数,但是方法的返回值类型不能为空。
例: static int Test3(int i, int j)
{
return i + j;
}
static void Main(string[] args)
{
Func<int, int, int> a = Test3;//func后面必须指定一个返回值类型,参数类型可以有0-16个,
//先写参数类型,最后一个是返回值类型。
int res = a(1, 5);
Console.WriteLine(res);
Console.ReadKey();
}
通过例子我们可以发现Func后面可以跟很多类型,最后一个是返回值类型,前面的类型是参数类型,参数类型必须跟指向的方法的参数类型按照顺序对应。
三、多播委托
下面跟大家说一下什么是多播委托。多播委托就是一个将各个委托集合到一起,做成一个Delegate[],然后我们同样可以通过foreach的方法,对其内部的委托进行查找。那么我们如何将各种方法集合到一起呢?下面写个小例子,大家就明白了。
例://常规创建两个测试方法:
static void Test1()
{
Console.WriteLine("test1");
}
static void Test2()
{
Console.WriteLine("test2");
}
static void Main(string[] args)
{
Action a = Test1;//将Test1赋值给委托a;
a += Test2;//通过+=符号,为委托变量增加Test2方法;
a();
Console.ReadKey();
}
我们可以通过+=和-=这两个符号,对委托类型a中的方法集合进行增减,但是要注意,如果这个委托集合中有任何一个方法发生异常的话,整个集合的迭代都会停止。