欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中委托用法實例分析

 更新時間:2015年05月07日 12:37:45   作者:小蘿莉  
這篇文章主要介紹了C#中委托用法,較為詳細的分析了C#中委托的概念與相關的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了C#中委托用法。分享給大家供大家參考。具體分析如下:

Delegate委托,在.NET中應用的非常廣泛。會涉及到Lambda表達式,事件,匿名方法等。

那么何為委托?

通俗的來講,委托除了必須指定delegate關鍵字和沒有方法實體之外,和指定方法沒有更多區(qū)別。你可以當它是一個占位符,比如你在寫代碼的時候并不知道你將要處理的是什么。你只需要知道你將要引入的參數(shù)類型和輸出類型是什么并定義它即可。這就是書本上所傳達的方法簽名必須相同的意思。

下面我們來定義一個基本的委托:

public class Test 
{ 
 //定義委托 
 public delegate void D_Math(int a, int b); 
 public void Add(int a, int b) 
 { 
  Console.WriteLine("Add方法結(jié)果:{0}", a + b); 
 } 
 public void Cut(int a, int b) 
 { 
  Console.WriteLine("Cut方法結(jié)果:{0}", a - b); 
 } 
} 
[TestClass] 
public class UnitTest1 
{ 
 [TestMethod] 
 public void TestMethod1() 
 { 
  Test t = new Test(); 
  Test.D_Math D = new Test.D_Math(t.Add);
  //委托實例化,也可Test.D_Math D =t.Add; 
  D += t.Cut;
  //委托可以以隊列方式執(zhí)行多個方法,
  //以+=運算符或者-=來增加或者取消隊列中的方法 
  D(5, 6); 
 } 
}

以上看出來委托實用的地方了嗎?即委托可以執(zhí)行任何引入?yún)?shù)類型相同且返回類型相同的方法,甚至可以執(zhí)行簽名相同的方法隊列。

那么我們的方法簽名(即引入?yún)?shù)和輸出參數(shù))真的必須與委托完全一致嗎?答:不是的,我們不能忽略協(xié)變與逆變。

我們這里簡單介紹一下協(xié)變與逆變的知識。

“協(xié)變”是指能夠使用與原始指定的派生類型相比,派生程度更大的類型。
“逆變”則是指能夠使用派生程度更小的類型。
那么,我們的委托也是接受協(xié)變與逆變的。
意思是,如果定義一個delegate,那么不僅僅簽名完全相同的方法可以賦值給delegate變量。
如果一個方法的參數(shù)表符合delegate聲明,但返回的類型是(delegate聲明返回類型)的派生類,那也可以將這個方法賦值給這個delegate變量。
如果一個方法的返回類型符合delegate的聲明,但參數(shù)是(delegate聲明參數(shù)類型)的祖先類,那也可以將這個方法賦值給這個delegate變量。
如果一個方法的參數(shù)和返回類型都符合上面兩行的假設,那也可以將這個方法賦值給這個delegate變量。

以下以兩個簡單示例解釋協(xié)變與逆變:

協(xié)變:

public class A { } 
public class B:A { }//B繼承自A 
public class Test 
{ 
  //定義委托 
  public delegate A D_Math(); 
  public B Add() 
  { 
   return new B(); 
 
  } 
  public A Add2() 
  { 
   return new A(); 
  } 
} 
[TestClass] 
public class UnitTest1 
{ 
  [TestMethod] 
  public void TestMethod1() 
  { 
   Test.D_Math d = new Test.D_Math(new Test().Add);
   //委托返回A,而Add方法返回B,此為協(xié)變。 
  } 
}

逆變:

public class A { } 
public class B:A { }//B繼承自A 
public class Test 
{ 
  //定義委托 
  public delegate void D_Math(B b); 
  public void Add(B b) 
  { 
 
  } 
  public void Add2(A a) 
  { 
 
  } 
} 
[TestClass] 
public class UnitTest1 
{ 
  [TestMethod] 
  public void TestMethod1() 
  { 
   Test.D_Math d = new Test.D_Math(new Test().Add2);
   //委托引入?yún)?shù)B,而Add方法參數(shù)為A類型,此為協(xié)逆變。 
  } 
}

希望本文所述對大家的C#程序設計有所幫助。

相關文章

最新評論