(1)C#共有3种内置泛型委托
(2)委托概念
1.委托的特点
委托类似于 C++ 函数指针,但它们是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不必与委托签名完全匹配。
delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。它所实现的功能与C/C++中的函数指针十分相似
2.总结:
:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。
Delegate至少0个参数,至多16个参数,可以无返回值,也可以指定返回值类型
Func可以接受0个至16个传入参数,必须具有返回值
Action可以接受0个至16个传入参数,无返回值
Predicate只能接受一个传入参数,返回值为bool类型
class Test
{
delegate void DelegateTest(string s);
//声明一个委托
delegate void MyDel(int n, int m);
public static void ActionTest(Object i) {
Console.WriteLine(i);
}
public static int FuncTest(int i)
{
return i;
}
static bool Compair(int z)
{
return z >10;
}
public static void HellowChinese(string strChinese)
{
Console.WriteLine("Good morning," + strChinese);
}
static void Main(string[] args)
{
#region 使用匿名方法
MyDel del = delegate(int m, int n)
{
Console.Write(m - n + " ");
};
Console.WriteLine("准备好了哦,要开始调用委托了哦!");
for (int i = 0; i < 10; i++)
{
del(i, 1);
}
#endregion
#region 在编译器无法推断输入类型时可以显式指定类型,
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
Console.WriteLine(isTooLong(1,"212"));
#endregion
//
#region delegate委托
DelegateTest dt = new DelegateTest(HellowChinese);
dt("cz");//输出结果:Good morning,cz
//
#endregion
//委托提供了一种可以直接访问类中方法的途径,可以将方法当作一个参数传递从而使用。
#region 使用Action委托传递方法
string mes = "w";
int ss = 0;
// 实例化
Action<Object> d = ActionTest;
d(mes);//输出w
d(ss);//输出0
#endregion
#region 使用Func委托传递方法-C#共有3种内置泛型委托
Func<int,int> f = FuncTest;
Console.WriteLine("fun方法"+f(12));
#endregion
#region 有参数无返回值
Action<int> a3 = (x) => Console.WriteLine(x);
a3(1);
#endregion
#region 无参数有返回值的情况
Func<int> e1 = () => 100;
var value1 = e1();
Console.WriteLine(value1);//输出为100
#endregion
//Func委托有返回值,Action委托没有返回值。
// Func<int,int> 最后一个泛型是返回值的类型,前面的类型为输入类型,
#region 有参数有返回值的情况,
int value2 = 0;
// 最后一个泛型是返回值的类型
Func<int,int> e2 = (x) =>{
return value2 = x + 1;
};
Console.WriteLine(e2(6));
// 多参数情况
Func<int, int,int> e3 = (x,x2) => x+x2 + 1;
int value3 = e3(1,2);
Console.WriteLine(value3);
#endregion
#region Predicate:此委托返回一个bool值,该委托通常引用一个"判断条件函数"。---不用在<>中注明返回类型bool类型。
// 其实Predicate可以用Func返回值是bool来代替的。
Predicate<int> p = (x) => x > 0;
bool value4 = p(1);
Console.WriteLine(value4);//输出为:True。
#endregion
#region Predicate委托传递一个方法--Predicate有且只有一个参数,返回值固定为bool
Predicate<int> pt=Compair;
Console.WriteLine(pt(1));//false
//和lambda表达式放在一起用
Predicate<int> ps = s => s == 12;
Console.WriteLine(ps(1));//false
#endregion
Console.Read();
}
}
(3)多播委托
也可以说是合并委托,你可以使用 + 或者 += 将多个委托对象中的列表进行组合。在调用多播委托的同时,调用的顺序会依照调用列表中的顺序。需要注意的是,在合并的同时只能合并相同类型的委托。可以使用 - 和 -= 从多播委托中移除一个方法或方法列表。
#region Lambda表达式创建委托
MyDel del4 = () =>
{
Console.WriteLine(" {nameof(Print)}...");
};
del4();
TestDel del5 = (x, y) =>
{
Console.WriteLine("{0}+{1}={2}", x, y, x + y);
};
del5(1, 2);//输出为1+2=3;
Console.Read();
#endregion