委托是什么?
委托是一种特殊的对象类型,它定义了方法的类型,使得可以将方法当作一个参数在另一个方法中传递。
为什么要引入委托?看下面一个打招呼的例子。。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
public class ClPeople
{
public void saychinese(string strName)
{
Console.WriteLine(strName+"你好!");
}
public void DoWork(string strName)
{
saychinese(strName);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
class Program
{
static void Main(string[] args)
{
ClPeople cp = new ClPeople();
cp.DoWork("中国");
}
}
}
想过木有?如果打招呼的是个英国人呢?看不懂中文的呀?咋办。。如下:
红色是 追加的代码。。。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
public class ClPeople
{
public void saychinese(string strName)
{
Console.WriteLine(strName+"你好!");
}
public void sayenglish(string strName)
{
Console.WriteLine(strName+"Hello!");
}
public enum Language
{
English,Chinese
}
public void DoWork(string strName,Language lanName )
{
switch (lanName)
{
case Language.Chinese:
saychinese(strName);
break;
case Language.English:
sayenglish(strName);
break;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
class Program
{
static void Main(string[] args)
{
ClPeople cp = new ClPeople();
cp.DoWork("中国",ClPeople.Language.Chinese);
cp.DoWork("Chinese",ClPeople.Language.English);
}
}
}
一次类推如果打招呼的是个法国人?or阿拉伯人?or韩国人呢?总不能接着改DoWork接着case吧?接着判断吧?呵呵。。当然不能了。。所以:有了委托。。。
委托关键字:delegate 格式(定义委托的语法):delegate void(返回值类型) SayDelegate(委托名称)();
注意:所定义的委托是参数 返回值。。是一样的。。。委托对方法就好像是 string 对 字符串一样。。(个人理解)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
//定义一个委托
public delegate void SayDelegate(string strName);
public class ClPeople
{
public void saychinese(string strName)
{
Console.WriteLine(strName+"你好!");
}
public void sayenglish(string strName)
{
Console.WriteLine(strName+"Hello!");
}
/// <summary>
/// 描述
/// </summary>
/// <param name="strName">姓名</param>
/// <param name="sdMakeSay">方法参数</param>
public void DoWork(string strName,SayDelegate sdMakeSay)
{
sdMakeSay(strName);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
class Program
{
static void Main(string[] args)
{
ClPeople cp = new ClPeople();
cp.DoWork("中国",cp.saychinese);
cp.DoWork("Chinese",cp.sayenglish);
}
}
}
其实。。委托不同于sting的一个特性;就是可以把多个方法赋给一个委托,或者说将多个方法绑定到一个委托上。。也就是多播委托。。如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateLearn
{
class Program
{
static void Main(string[] args)
{
ClPeople cp = new ClPeople();
cp.DoWork("中国",cp.saychinese);
cp.DoWork("Chinese",cp.sayenglish);
//第一个方法绑定
SayDelegate delegate1 = cp.saychinese;
//第二个方法绑定。。。。。
delegate1 += cp.sayenglish;
cp.DoWork("中国",delegate1);
}
}
以上纯属个人理解。。有错请指导。。。不喜勿喷。。。