什么是委托,为什么用委托?
我的理解是把一个方法放到委托中,用委托比较方便,如果有几个方法,就有一句话不同怎么办?把那段代码当成一个变量,从外边接受。
拿一个例子来说。
把一个字符串数组的各个元素变成大写或小写。
static string ProToUpper(string str)
{
return str.ToUpper();
}
static string ProToLower(string str)
{
return str.ToLower();
}
这这个方法就是两个单词不同。
如果使用委托的话现在命名空间下,加上这句话。
public delegate string DelString(string str);
这句话我的理解就是把上边两个方法做了一个规范化,并且给方法作为方法,定义了一类型。首先看,他们的返回值类型和参数的类型都是一样的。
在来看一下怎么用委托把两个方法化成一个方法。
static void ProString(string[] names, DelString del)
{
for (int i = 0; i < names.Length; i++)
{
names[i] = del(names[i]);
}
}
在来看一下怎么调用?
ProString(names, (str) => { return str.ToUpper(); });
foreach (string item in names)
{
Console.WriteLine(item);
}
Console.ReadKey();
其中 (str) => { return str.ToUpper();就是一个方法(lambda表达式)。
看一下整体的方法。
static void Main(string[] args)
{
string[] names = { "abcDEdf", "ghIGKDfds", "fdsfsDSFDSfds" };
//转大写 转小写 双引号
//我们可以把一个函数直接赋值给一个委托
//DelString del = ProToUpper;//new DelString(ProToUpper);
ProString(names, delegate(string str) { return str.ToLower(); });//匿名函数
ProString(names, (str) => { return str.ToUpper(); });
foreach (string item in names)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
static void ProString(string[] names, DelString del)
{
for (int i = 0; i < names.Length; i++)
{
names[i] = del(names[i]);
}
}
}
函数可以到处调用,事件也是方法,但是需要得到触发。事件是比较安全的。