好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

委托

委托

写给那些看不懂委托的同学

C# 从1.x 发展到目前的 4.5,委托的写法真是越来越简单精悍。如果您对这些委托的写法不是很清晰,本文可以帮助到您。

委托是一种安全封装方法的类型,可以将方法作为方法的参数。
委派方法的参数个数、顺序、类型及方法返回值类型必须跟定义的委托方法一样,但参数名称可以不同 。

1、C# 定义一个完整委托:

 delegate   string  SayMessage( string   msg);
  static   string  SayHello( string   Name)
{
     return   string .Format( "  Hello {0}  "  , Name);
}
  static   void  Main( string  [] args)
{
   SayMessage say  =  new   SayMessage(SayHello);
   Console.WriteLine(say(  "  委托  "  ));
   Console.ReadKey();
} 

 输出结果:"Hello 委托"

2、C#2.0后出现了匿名方法,可以将委托方法省略掉,直接给委托传递一个匿名方法,当然也要去掉New这个动作。

 delegate   string  SayMessage( string   msg);
  static   void  Main( string  [] args)
{ 
   SayMessage say  =  delegate ( string   Name)
   {
       return   string .Format( "  Hello {0}  "  , Name);
   };
   Console.WriteLine(say(  "  匿名方法  "  )); 
   Console.ReadKey();
} 

  输出结果:"Hello 匿名方法"

3、 聪明的人们总是想使用更少的代码达到相同的效果。因此C#3.0 之后出现了 Lambda表达式、Action委托、Func 委托

(1) Lambda表达式:匿名方法的升级版,可以简化匿名方法的写法。写法 (形参列表)=>{ 表达式 OR 函数体 }

 delegate   string  SayMessage( string   msg);
  static   void  Main( string  [] args)
{
   SayMessage say  = (Name) => 
   {
        return   string .Format( "  Hello {0}  "  , Name);
   };
   Console.WriteLine(say(  "  Lambda  "  ));
   Console.ReadKey();
} 

  输出结果:"Hello Lambda"

通过看上面的代码,能否将定义的委托 SayMessage 也去掉吗?当然可以,用 Func委托 或者 Action委托 就可以取代它!

(2)Func 委托:当我们封装一个具有返回值方法的时候就可以使用Func委托。

Func 委托一共有 15种重载,但总会有一个返回值,比如我们示例中用到的Func<T, TResult>委托就是其中之一。

Func<T, TResult>的作用就是  封装一个具有一个T类型参数并返回 TResult 类型值参数的方法。

如果封装方法没有有输入参数则直接使用Func<TResult> 委托。

 static   void  Main( string  [] args)
{
  Func < string ,  string > say1 =  delegate ( string   Name)
   {
       return   string .Format( "  Hello {0}  "  , Name);
   };
     //  和Lambda 结合 
   Func< string ,  string > say2 = (Name) => 
   {
       return   string .Format( "  Hello {0}  "  , Name);
   };
   Console.WriteLine(say1(  "  Func 委托  "  ));
   Console.WriteLine(say2(  "  Func 委托  "  )); 
   Console.ReadKey();
} 

   输出结果:"Hello Func 委托"

(3)Action委托:当我们封装一个没有返回参数的方法时,就可以使用Action委托。

Action委托也有 15种重载,封装的方法可有有输入参数,但不会有返回参数。

比如下面示例代码中用到的Action<T>委托,其作用就是  封装一个具有T类型参数且无返回值参数 的方法。

如果封装方法没有输入参数则可以直接使用 Action 委托。

 static   void  Main( string  [] args)
{
  Action < string > say1 =  delegate ( string   Name)
  {
    Console.WriteLine(  string .Format( "  Hello {0}  "  , Name));
  };
     //  和Lambda 结合 
  Action< string > say2 = (Name)=> 
  {
    Console.WriteLine(  string .Format( "  Hello {0}  "  , Name));
  };
  say1(  "  Action 委托  "  );
  say2(  "  Action 委托  "  );
  Console.ReadKey();
} 

 输出结果:"Hello Action 委托"

作者: Rising Sun

出处: http://www.cnblogs.com/lxblog/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

分类:  C# 基础补遗

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于委托的详细内容...

  阅读:38次