今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“每次见到委托和事件就觉得心里别(biè)得慌,混身不自在”。跨过这道坎的人就有种一览众山小的感觉了。我又浏览了皱华栋老师JamesZou的博文《深入理解C#委托及原理》(地址:),以及张子阳Jimmy Zhang的博文《C# 中的委托和事件》(地址:)总算对委托有了一点理性的感觉了,在此谢谢ITCAST,JamesZou以及Jimmmy Zhang的博文,谢谢。
1.委托是神马?
用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个“指针”。用邹老师的一个举例:“设想,如果我们写了一个厨师做菜方法用来做菜,里面有拿菜、切菜、配菜、炒菜 四个环节,但编写此方法代码的人想让配菜这个环节让调用方法的人实现,换句话说,就是想在方法被调用时接收代码 作为参数,在方法中执行这端传进来的代码。但,怎么为一个方法传 代码 进来呢?当然大家想到了传递接口方式来实现,咱先不讨论接口,因为微软为我们提供了一个叫做委托的类型。”
现在来看看怎样使用委托,根据itcast的ppt内容:
声明委托的方式:delegate 返回值类型 委托类型名(参数) 比如delegate void StringProcess(string s); 注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名
声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcess f1;
将委托类型变量指向函数 StringProcess sp = new StringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了“执行PrintIt函数,并且将sp指向PrintIt的返回值”。
这里看一个数据过滤的例子,输出int数组中的正整数:
1.声明一个委托:delegate bool FilterDelegate(int i);
2.封装一个过滤的静态方法,参数中包含一个过滤器的方法委托,返回泛型List<int>列表:
static List<int> Filter(List<int> list,FilterDelegate fd)
{
List<int> listTest = new List<int>();
foreach(int i in list)
{
if(fd(i))
{
listTest.Add(i);
}
}
return listTest;
}
3.写一个判断是否为正整数的方法,返回值为bool类型:
static bool isZhengshu(int i)
{
return i > 0;
}
4.在main函数中声明一个List列表,然后添加部分测试数据,将委托指向判断正整数的方法,最后遍历输出过滤后的数组数据;
List<int> listOne = new List<int>();
listOne.Add(1);
listOne.Add(-4);
listOne.Add(8);
listOne.Add(-6);
listOne.Add(13);
FilterDelegate fd = isZhengshu;
List<int> listResult = Filter(listOne, isZhengshu);
foreach (int i in listResult)
{
Console.WriteLine(i);
}
运行后,显示:1 8 13