最近在做的项目,正在进行重构,之前的框架就是纯三层的简单调用,外加一些Session,SQLHelper等封装管理类,其他的东西,一直也想去抽象,但是奈何能力还有所欠缺,抽象出来的东西,被组长狠狠的给鄙视了一番,最近在组长的带领下,重新搭建框架,整个过程下来,真的是被狠狠的打击了,也真是服了我们组长了,太牛了,看来自己欠缺的还是很多很多。具体的框架,后期熟悉了在给大家介绍,现在还是有点懵懵哒。
在跟组长交流的时候,组长说让我们多用委托,在之前做项目的时候貌似用到过,不过印象不大,在狠狠的恶补下C#的一些知识点!在网上查了一些关于委托和事件的资料,委托和事件在.Net Framework中的应用还是非常广泛的,有的人说,对于接触C#时间不长的人来说较好的理解委托和事件并不容易,它们一道门槛儿,过了这个槛儿的人,觉得真是太容易了,而没有走过这道门槛的人,每次见到委托和就觉得心里特别的别的慌,浑身不自在。确实是,不过学什么也都是这个理,你得懂得去坚持,主动的多想,多总结,有付出才会有回报!
什么是委托?
从字面上讲,委托两个字,中国人都应该知道什么意思,除非不认识这两个字,比如说:我委托你照看我家小猫。
但是在我们的程序世界里,也是这么的简单吗?委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。一句话,将方法作为方法的参数。
委托怎么用?
定义委托类型
delegate void OrderDelegate(string name);
声明委托对象
public static void GetOrder(string name)
{
Console.WriteLine("{0}到楼下帮我取下外卖!", name);
}
public static void BuyOrder(string name)
{
Console.WriteLine("{0}帮我定个外卖!", name);
}
创建委托对象(确定与哪些方法进行绑定)
public static void GetOrBuyOrder(string name, OrderDelegate orderDelegate)
{
orderDelegate(name);
}
使用委托调用方法
static void Main(string[] args)
{
OrderDelegate orderDel;
orderDel = GetOrder;
orderDel += BuyOrder;
GetOrBuyOrder("ling", orderDel);
Console.ReadKey();
}
使用委托注意事项
- 委托和方法必须具有相同的参数。
- 委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
- 使用+=和-=运算实现方法的增加和减少
为什么用委托?
为什么要用委托呢,委托有什么样的好处呢?咱们通过例子来说明,我们想在屏幕上输出一句问候语:
public void GreetPeople(string name) {
'''做某些额外的事情,比如初始化之类,此处略'''
EnglishGreeting(name);
}
'''英文版问候语'''
public void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
'''中文版问候语'''
public void ChineseGreeting(string name){
Console.WriteLine("早上好, " + name);
}
public enum Language{
English, Chinese
}
public void GreetPeople(string name, Language lang){
'''做某些额外的事情,比如初始化之类,此处略'''
swith(lang){
case Language.English:
EnglishGreeting(name);
break;
case Language.Chinese:
ChineseGreeting(name);
break;
}
}
上面的这个方法尽管能够把问题解决,但是这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。
总结
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
转载请注明出处:http://blog.csdn.net/zlts000/article/details/48324769