程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C#委托你不可不知的幾件事

關於C#委托你不可不知的幾件事

編輯:關於C語言

委托是C#中非常重要的一個概念,並在C#中得到了豐富的應用,如事件,線程等。那什麼是委托呢?具體來說,委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為。委托方法的使用可以像其他任何方法一樣,具有參數和返回值。

委托具有以下特點:

委托類似於 C++ 函數指針,但它是類型安全的。

委托允許將方法作為參數進行傳遞。

委托可用於定義回調方法。

委托可以鏈接在一起;例如,可以對一個事件調用多個方法。

方法不需要與委托簽名精確匹配。有關更多信息,請參見協變和逆變。

C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數傳遞,以代替單獨定義的方法。

在C#中使用委托分為三步:

1.定義委托:

  1. //聲明委托  
  2. public delegate void MyDel(); 

2.實例化委托:

  1. TestDel t = new TestDel();   
  2. Console.WriteLine("-----以下是簡單使用委托演示--------");  
  3. //t.MyMethod();  
  4.  
  5. ///實例化委托,用一個方法來進行實例化  
  6. ///該方法簽名要與委托簽名一致  
  7. MyDel del = new MyDel(t.MyMethod); 

3.調用委托:

  1. ///調用委托  
  2. del(); 

好了,其實委托的變化很復雜,但基本都會符合這麼三個步驟,說過了,這些,再來看一下完整的代碼

  1. namespace DelegateDemo{    
  2.   //聲明委托      
  3. public delegate void MyDel();      
  4. //聲明帶參的委托      
  5. public delegate void MyDel2(int num1, int num2);      
  6. //聲明帶有返值的委托      
  7. public delegate string MyDel3(string s);      
  8. //聲明委托用於演示匿名方法    
  9.   public delegate string ProcessString(string s);    class Program     
  10.  {          
  11. static void Main(string[] args)        
  12.   {           
  13.    #region 委托演示                       
  14.                /*       
  15.        TestDel t = new TestDel();                
  16.         #region 簡單實例化委托與調用委托        
  17.       Console.WriteLine("-----以下是簡單使用委托演示--------  
  18. ");             
  19.  //t.MyMethod();       
  20. ///實例化委托,用一個方法來進行實例化         
  21.      ///該方法簽名要與委托簽名一致    
  22.           MyDel del = new MyDel(t.MyMethod);                    
  23.      ///調用委托          
  24.     del();        
  25.       //C#2.0後可以這種方式實例化委托          
  26.     MyDel del4 = t.MyMethod;           
  27.    del4();        
  28.      //用靜態方法進行實例化     
  29.          del4 = TestDel.MyStaticMethod;      
  30.         del4();           
  31.    //以下代碼效果相同        
  32.       //MyDel2 del2 = new MyDel2(t.MyMethod);            
  33.   //del2(10, 20);          
  34.     MyDel2 del2 = t.MyMethod;           
  35.    del2(10, 20);           
  36.    //MyDel3 del3 = new MyDel3(t.MyMethod);          
  37.     //Console.WriteLine(del3("abc"));         
  38.    #endregion             
  39.             #region 匿名方法實例化委托          
  40.   Console.WriteLine("-----以下是匿名方法演示--------");           
  41.    //用匿名方法實例化委托         
  42.      ProcessString p = delegate(string inputString) {            
  43.       return inputString.ToUpper();      
  44.         };      
  45.         //通過委托調用匿名方法         
  46.      Console.WriteLine(p("aaaa"));        
  47.     #endregion            
  48.   #region 委托多播演示             
  49.  Console.WriteLine("-----以下是委托多播演示--------");            
  50.   MyDel mydel1 = t.MyMethod;      
  51.         MyDel mydel2 = t.MyMethod2;       
  52.        MyDel mydel3 = TestDel.MyMethod3;      
  53.       MyDel allMyDel = mydel1 + mydel2 + mydel3;       
  54.      allMyDel();           
  55.    allMyDel -= mydel3;       
  56.        allMyDel();            
  57.   #endregion                 
  58.        #region 委托作為參數演示         
  59.      Console.WriteLine("-------以下是委托作為參數演示------");      
  60.         MyDel3 paramMyDel3 = t.MyMethod;         
  61.    TestDel.MyParamMethod("aaa", paramMyDel3);        
  62.     #endregion           
  63.    #region 委托作為返回值          
  64.     Console.WriteLine("---以下是委托作為返回值演示------");          
  65.     ///returnMyDel指向t.MyReturnMethod()的返回值          
  66.   MyDel3 returnMyDel = t.MyReturnMethod();        
  67.       ///returnMyDel指向t.MyMethod          
  68.     //MyDel3 returnMyDel = t.MyMethod;     
  69.          Console.WriteLine(returnMyDel("sssssssssssss"));        
  70.       #endregion         
  71.       */           
  72.    #endregion           
  73.    //MyReturnDelegateTest my = new MyReturnDelegateTest();       
  74.        //my.MyTest();         
  75.      MyParamDelegateTest myParam = new MyParamDelegateTest();         
  76.      myParam.AddBooks();        
  77.       myParam.MyTest();        
  78.   }    }    public class TestDel   
  79.    {    
  80.       #region 普通方法        
  81.   public static void MyStaticMethod()       
  82.    {            
  83.   Console.WriteLine("My Static Method");     
  84.      }      
  85.     public void MyMethod()     
  86.      {            Console.WriteLine("MyMethod");   
  87.        }        public void MyMethod2()        {       
  88.      Console.WriteLine("My Method 22222222222");      
  89.     }       
  90.    public static void MyMethod3()      
  91.     {          
  92.     Console.WriteLine("My Method 3333333333333");     
  93.    }        
  94.   public void MyMethod(int num1, int num2)       
  95.  {     
  96.        Console.WriteLine(num1+num2);    
  97.       }        
  98.   public string MyMethod(string s)    
  99.       {            return s.ToUpper();      
  100.     }        #endregion         
  101.  /// <summary>       
  102.    /// 委托作為方法參數      
  103.     /// </summary>        
  104.   /// <param name="s"></param>       
  105.    /// <param name="del3"></param>      
  106.     public static void MyParamMethod(string s, MyDel3 del3)   
  107.      {         
  108.      Console.WriteLine(del3(s));      
  109.     }        /// <summary>    
  110.       /// 委托作為返回值        
  111.   /// </summary>       
  112.    /// <param name="s"></param>      
  113.     /// <returns></returns>     
  114.      public MyDel3 MyReturnMethod()      
  115.     {              
  116. ///返回符合委托規范的方法        
  117.      return MyMethod;        
  118.   }    } 

委托作為參數示例:

委托作為參數

  1.   public class MyParamDelegateTest    
  2.   {      
  3.     BookDB bookDB = new BookDB();    
  4.       public void AddBooks()       
  5.  {                
  6.  bookDB.AddBook(new Book() { BookID=1,BookName="C#",Price=123,IsPaperbook=true });           
  7.  bookDB.AddBook(new Book() { BookID = 1, BookName = "C#", Price = 123, IsPaperbook = false });     
  8.  bookDB.AddBook(new Book() { BookID = 2, BookName = "ASP.Net", Price = 12, IsPaperbook = true });             
  9.  bookDB.AddBook(new Book() { BookID = 1, BookName = "ADO", Price = 23, IsPaperbook = false });   
  10.      }       
  11.    /// <summary>         
  12.  /// 用來實例化委托        
  13.   /// </summary>        
  14.   /// <param name="b"></param>       
  15.    public void TestProcessBook(Book b)     
  16.    {           
  17.  if (b.IsPaperbook)            {          
  18.       Console.WriteLine(b.BookName);           
  19.    }        }     
  20.      double total = 0;      
  21.  public void TotalPrice(Book b)    
  22.    {            total += b.Price;       
  23.  }        public void MyTest()        {                        
  24.  //ProcessBook p=TestProcessBook;             
  1.  //ProcessBook p1=TotalPrice;           
  2.    //ProcessBook p2=p+p1;         
  3.      //把方法名做為參數進行傳遞        
  4.       bookDB.PrintBook(TestProcessBook);      
  5.       bookDB.PrintBook(TotalPrice);        
  6.     Console.WriteLine(total);        
  7.   }    }     
  8.  public delegate void ProcessBook(Book b);  
  9.   public class BookDB    {    
  10.       public List<Book> books = new List<Book>();    
  11.     public void AddBook(Book b)     
  12.      {          
  13.     books.Add(b);       
  14.    }         
  15.  public void PrintBook(ProcessBook process)     
  16.    {          
  17.     foreach (var book in books)            {       
  18.          process  
  19. (book);            }            
  20.           }    }    public class Book     
  21.  {        public int BookID { get; set; }       
  22.    public string BookName { get; set; }      
  23.     public double Price { get; set; }    
  24.       public bool IsPaperbook { get; set; }   
  25.    } 

委托作為返回值:

委托作為返回值

  1.  public delegate int MyReturnDelegate(int num1, int num2);   
  2.  public class MyReturnDelegateTest    {        
  3. public void MyTest()      
  4.   {         
  5.    MyCalcuate myCalcuate = new MyCalcuate();        
  6.     do      
  7.       {              
  8.   Console.WriteLine("請輸入符號進行以計算( + - * /)");            
  9.     string oper = Console.ReadLine();           
  10.      Console.WriteLine("請輸入操作數1");       
  11.          string num1 = Console.ReadLine();          
  12.       Console.WriteLine("請輸入操作數2");              
  13.   string num2 = Console.ReadLine();           
  14.      MyReturnDelegate myReturn = myCalcuate.Calcuate(oper);          
  15.       int result = myReturn(int.Parse(num1), int.Parse(num2));              
  16.   Console.WriteLine(                 
  17.    string.Format("{0}{1}{2}={3}", num1,oper,num2, result));            
  18.     Console.WriteLine("您還要繼續嗎?Y/N");               
  19.  //string continueFlag = Console.ReadLine();               
  20.  //if (continueFlag.ToUpper() == "N") break;            
  21. } while (Console.ReadLine().ToUpper()!="N");        }    
  22. }     
  23. ublic class MyCalcuate   
  24.  {        
  25. public MyReturnDelegate Calcuate(string oper)        {            
  26. MyReturnDelegate myReturn = null;         
  27.    switch (oper)     
  28.        {                case "+":              
  29.       myReturn = delegate(int num1, int num2) { return num1 + num2; };              
  30.       break;              
  31.   case "-":                  
  32.   myReturn = delegate(int num1, int num2) { return num1 - num2; };              
  33.       break;           
  34.      case "*":                   
  35.  myReturn = delegate(int num1, int num2) { return num1 * num2; };                
  36.     break;             
  37.    case "/":          
  38.           myReturn = delegate(int num1, int num2) { return num1 / num2; };     
  39.                break;              
  40.   default:                  
  41.   break;            }     
  42.        return myReturn;       
  43.  }    } 
原文鏈接:http://www.cnblogs.com/yangyancheng/archive/2011/04/21/2024145.Html

【編輯推薦】

  1. .Net不用控件實現文件夾監測系統
  2. 詳解C#中不同類的類型
  3. 淺談C#中標准Dispose模式的實現
  4. C#圖片處理的3種高級實用方法
  5. C# 4.0新特性:協變與逆變中的編程思想
  【責任編輯:彭凡 TEL:(010)68476606】
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved