委托是一种数据类型,像类一样(可以声明委托类型变量),委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
1.委托是一种数据类型,像类一样的一种数据类型。一般都是直接在命名空间中定义。
2.定义委托时,需要指明返回值类型、委托名与参数列表.这样就能确定该类型的委托能存储什么样的方法。
3.使用委托:
3.1声明委托变量。
3.2委托是一个引用类型,就像类一样,所以当声明委托变量后,如果不赋值则该委托变量为null。所以在使用委托变量前最好做非空校验weituo!=null
3.3委托类型的变量只能赋值一个委托类型的对象。
委托的使用:
第一种写法: namespace 委托 { //声明一个委托指向一个函数 public delegate void DelSayHi(string name); class Program { static void Main(string[] args) { //DelSayHi del = new DelSayHi(SayHiEnglish); //将制定的函数传入到委托中 DelSayHi del = new DelSayHi(SayHiChinese); //或者可以这样写:DelSayHi del = SayHiEnglish;可直接把函数赋值给委托,实际上还是调用了new方法。 del("张三"); Console.ReadKey(); } public static void SayHiChinese(string name) { Console.WriteLine("吃了吗?" + name); } public static void SayHiEnglish(string name) { Console.WriteLine("Nice to meet you" + name); } } } 第二种写法: namespace 委托 { //声明一个委托指向一个函数 public delegate void DelSayHi(string name); class Program { static void Main(string[] args) { Test("张三", SayHiEnglish); Console.ReadKey(); } public static void Test(string name, DelSayHi del) { del(name); } public static void SayHiChinese(string name) { Console.WriteLine("吃了吗?" + name); } public static void SayHiEnglish(string name) { Console.WriteLine("Nice to meet you" + name); } } } 第三种写法:委托加匿名函数 匿名方法:不能在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托。 namespace 匿名函数 { //第一步:先声明一个委托 public delegate void DelSayHi(string name); class Program { static void Main(string[] args) { //第二步:把匿名函数赋值给委托 DelSayHi del = delegate(string name) { Console.WriteLine("nice to meet you" + name); }; del("张三"); Console.ReadKey(); } } } 第四种方法:委托加lamda表达式:比匿名函数更方便(不需要传数据类型,因为委托已经限定了数据类型) namespace _lamda表达式 { public delegate void DelSayHi(string name); class Program { static void Main(string[] args) { DelSayHi del = (string name) => { Console.WriteLine("你好" + name); };//等价于DelSayHi del = name => { Console.WriteLine("你好" + name); } del("张三"); Console.ReadKey(); } } }