转帖 C# 语法 委托

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 * 委托(delegate)
委托聲明定義了一种類型,它用一組特定的參數以及返回類型來封裝方法.
對於靜態方法,委托對像封裝要調用的方法.
對於實例方法,委托對像同時封裝一個實例和該實例上的一個方法.
如果您有一個委托對像和一組適當的參數,則可以用這些參數調用該委托.
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
// 要注意的是委托的返回值類型必須和代理的方法一致
 
// 下面的zsEat() 是一個void無返回值類型,所以委托也必需是一個void類型.
 
// 委托的參數也必需和代理的方法一致,參數的個數以及類型都必需一致.
  class  Mydelegate
 {
     
static   void  zsEat( string  food)
     {
         Console.WriteLine(
" 張三吃 "   +  food);
     }
     
static   void  lsEat( string  food)
     {
         Console.WriteLine(
" 李四吃 "   +  food);
     }
      
static   void  wwEat( string  food)
     {
         Console.WriteLine(
" 王五吃 "   +  food);
     }
     
static   void  Main()
     {
         zsEat(
" 西瓜----直接調用 " ); // 直接調用
         Eatdelegate zs = new  Eatdelegate(zsEat); // 此處()內的字符必需有代理的方法名稱一致.
         Eatdelegate ls = new  Eatdelegate(lsEat);
         Eatdelegate ww
= new  Eatdelegate(wwEat);
         zs(
" 西瓜----通過委托調用 " ); // 通過委托調用
         ls( " 西瓜----通過委托調用 " );
         ww(
" 西瓜----通過委托調用 " );
     }
 }

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:37
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 *上個例子中我們調用了三次委托的方法,這樣感覺上挺麻煩的這節課講一下委托鏈
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
// 要注意的是委托的返回值類型必須和代理的方法一致
 
// 下面的zsEat() 是一個void無返回值類型,所以委托也必需是一個void類型.
 
// 委托的參數也必需和代理的方法一致,參數的個數以及類型都必需一致.
  class  Mydelegate
 {
     
static   void  zsEat( string  food)
     {
         Console.WriteLine(
" 張三吃 "   +  food);
     }
     
static   void  lsEat( string  food)
     {
         Console.WriteLine(
" 李四吃 "   +  food);
     }
      
static   void  wwEat( string  food)
     {
         Console.WriteLine(
" 王五吃 "   +  food);
     }
     
static   void  Main()
     {
         zsEat(
" 西瓜----直接調用 " ); // 直接調用
         Eatdelegate zs = new  Eatdelegate(zsEat); // 此處()內的字符必需有代理的方法名稱一致.
         Eatdelegate ls = new  Eatdelegate(lsEat);
         Eatdelegate ww
= new  Eatdelegate(wwEat);
         Eatdelegate eatChain;
// 聲明委托鏈
         eatChain = zs + ls + ww; // 將各托相加,執行的順序是接相加的順序.
         eatChain( " 西瓜----通過委托調用 " ); // 執行結果和前一個例子一樣.

     }
 }

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 *上個例子中我們調用了三次委托的方法,這樣感覺上挺麻煩的這節課講一下委托鏈
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
// 要注意的是委托的返回值類型必須和代理的方法一致
 
// 下面的zsEat() 是一個void無返回值類型,所以委托也必需是一個void類型.
 
// 委托的參數也必需和代理的方法一致,參數的個數以及類型都必需一致.
  class  Mydelegate
 {
     
static   void  zsEat( string  food)
     {
         Console.WriteLine(
" 張三吃 "   +  food);
     }
     
static   void  lsEat( string  food)
     {
         Console.WriteLine(
" 李四吃 "   +  food);
     }
      
static   void  wwEat( string  food)
     {
         Console.WriteLine(
" 王五吃 "   +  food);
     }
     
static   void  Main()
     {
         zsEat(
" 西瓜----直接調用 " ); // 直接調用
         Eatdelegate zs = new  Eatdelegate(zsEat); // 此處()內的字符必需有代理的方法名稱一致.
         Eatdelegate ls = new  Eatdelegate(lsEat);
         Eatdelegate ww
= new  Eatdelegate(wwEat);
         Eatdelegate eatChain;
// 聲明委托鏈
         Console.WriteLine( " 張三,李四,王五開座談會. " );
         eatChain
= zs + ls + ww; // 將各托相加,執行的順序是接相加的順序.
         eatChain( " 西瓜----通過委托調用 " ); // 執行結果和前一個例子一樣.
         Console.WriteLine( " 李四接了個電話 " );
         eatChain
-= ls;
         eatChain(
" 香蕉 " );
         Console.WriteLine(
" 李四回來了 " );
         eatChain
+= ls; // 此處再把ls加進來後李四就變成最後一個執行的方法了.
         eatChain( " 桔子 " );

     }
 }

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 *上個例子中我們調用了三次委托的方法,這樣感覺上挺麻煩的這節課講一下委托鏈
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
// 要注意的是委托的返回值類型必須和代理的方法一致
 
// 下面的zsEat() 是一個void無返回值類型,所以委托也必需是一個void類型.
 
// 委托的參數也必需和代理的方法一致,參數的個數以及類型都必需一致.
  class  Mydelegate
 {
     
static   void  Main()
     {
         Eatdelegate eatChain
= null ; // 聲明委托鏈
         
// 下面是匿名方法的介紹
         
// webcast中,李建忠"C#2.0銳利體驗系列課程"中有一節"匿名方法,迭代器"的講課.
         eatChain += delegate ( string  food){Console.WriteLine( " 張三吃 "   +  food);};
         eatChain
+= delegate ( string  food){Console.WriteLine( " 李四吃 "   +  food);};
         eatChain
+= delegate ( string  food){Console.WriteLine( " 王五吃 "   +  food);};
         eatChain(
" 西瓜----通過委托調用 " ); // 執行結果和前一個例子一樣.
     }
 }

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 *前幾個例子都是對靜態方法的委托,下面的例子是對動態方法的委托
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
class  Man
 {
     
private   string  name;
     
public  Man( string  name_)
     {
         name
= name_;
         
// or this.name=name_;
     }
     
public   void  Eat( string  food)
     {
         Console.WriteLine(name 
+   " "   +  food);
     }

 }
 
class  Party
 {
      
static   void  Main()
     {
          Man ZS
= new  Man( " 張三 " );
          Man LS
= new  Man( " 李四 " );
          Man WW
= new  Man( " 王五 " );
         Eatdelegate zs
= new  Eatdelegate(ZS.Eat); // 此處()內的字符必需有代理的方法名稱一致.
         Eatdelegate ls = new  Eatdelegate(LS.Eat);
         Eatdelegate ww
= new  Eatdelegate(WW.Eat);
         Eatdelegate eatChain;
// 聲明委托鏈
         Console.WriteLine( " 張三,李四,王五開座談會. " );
         eatChain
= zs + ls + ww; // 將各托相加,執行的順序是接相加的順序.
         eatChain( " 西瓜----通過委托調用 " ); // 執行結果和前一個例子一樣.
         Console.WriteLine( " 李四接了個電話 " );
         eatChain
-= ls;
         eatChain(
" 香蕉 " );
         Console.WriteLine(
" 李四回來了 " );
         eatChain
+= ls; // 此處再把ls加進來後李四就變成最後一個執行的方法了.
         eatChain( " 桔子 " );
     }    
 }

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/9/2
 * Time: 下午 10:23
 *下面介紹的是如何把委托做為一個方法傳遞,並進行動態的調用
 * webcast 俞暉的"Modern C#系統課程"的"深入委托和事件"
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
delegate   void  Eatdelegate( string  food);
 
class  Man
 {
     
private   string  name;
     
public  Man( string  name_)
     {
         name
= name_;
         
// or this.name=name_;
     }
     
public   void  Eat( string  food)
     {
         Console.WriteLine(name 
+   " "   +  food);
     }

 }
 
class  Party
 {
     
static   void  eatTogther( string  food, params  Eatdelegate[] values)
     {
         
if (values == null )
         {
             Console.WriteLine(
" 座談會結束了 " );
         }
         
else
         {
             Eatdelegate eatChain
= null ;
             
foreach (Eatdelegate ed  in  values)
                 eatChain
+= ed;
             eatChain(food);
             Console.WriteLine();
         }
     }
      
static   void  Main()
     {
          Man ZS
= new  Man( " 張三 " );
          Man LS
= new  Man( " 李四 " );
          Man WW
= new  Man( " 王五 " );
         Eatdelegate zs
= new  Eatdelegate(ZS.Eat); // 此處()內的字符必需有代理的方法名稱一致.
         Eatdelegate ls = new  Eatdelegate(LS.Eat);
         Eatdelegate ww
= new  Eatdelegate(WW.Eat);
         Console.WriteLine(
" 張三,李四,王五開座談會. " );
         eatTogther(
" 西瓜 " ,zs,ls,ww);
         Console.WriteLine(
" 李四接了個電話 " );
         eatTogther(
" 香蕉 " ,zs,ww);
         Console.WriteLine(
" 李四回來了 " );
         eatTogther(
" 桔子 " ,zs,ls,ww);
         eatTogther(
null , null );
     }    
 }

 

using  System;
public   delegate   void  GreetingDelegate( string  name);
class  Test
{
    
private   static   void  GreetPepole( string  name,GreetingDelegate MakeGreeting)
    {
        MakeGreeting(name);
    }
    
private   static   void  EnglishGreeting( string  name)
    {
        Console.WriteLine(
" Hello, "   +  name);
    }
    
private   static   void  ChineseGreeting( string  name)
    {
        Console.WriteLine(
" 你好, "   +  name);
    }
    
static   void  Main()
    {
        
/*
        GreetPepole("Athrun",EnglishGreeting);
        GreetPepole("張學友",ChineseGreeting);
        //
*/
        GreetingDelegate d
= new  GreetingDelegate(EnglishGreeting);
        d
= ChineseGreeting;
        d
+= EnglishGreeting;
        d
+= ChineseGreeting;
        d(
" 張學友 " );
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值