程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中拜托用法實例剖析

C#中拜托用法實例剖析

編輯:C#入門知識

C#中拜托用法實例剖析。本站提示廣大學習愛好者:(C#中拜托用法實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中拜托用法實例剖析正文


本文實例講述了C#中拜托用法。分享給年夜家供年夜家參考。詳細剖析以下:

Delegate拜托,在.NET中運用的異常普遍。會觸及到Lambda表達式,事宜,匿名辦法等。

那末作甚拜托?

淺顯的來說,拜托除必需指定delegate症結字和沒無方法實體以外,和指定辦法沒有更多差別。你可以當它是一個占位符,好比你在寫代碼的時刻其實不曉得你將要處置的是甚麼。你只須要曉得你將要引入的參數類型和輸入類型是甚麼並界說它便可。這就是書本上所轉達的辦法簽名必需雷同的意思。

上面我們來界說一個根本的拜托:

public class Test 
{ 
 //界說拜托 
 public delegate void D_Math(int a, int b); 
 public void Add(int a, int b) 
 { 
  Console.WriteLine("Add辦法成果:{0}", a + b); 
 } 
 public void Cut(int a, int b) 
 { 
  Console.WriteLine("Cut辦法成果:{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;
  //拜托可以以隊列方法履行多個辦法,
  //以+=運算符或許-=來增長或許撤消隊列中的辦法 
  D(5, 6); 
 } 
}

以上看出來拜托適用的處所了嗎?即拜托可以履行任何引入參數類型雷同且前往類型雷同的辦法,乃至可以履行簽名雷同的辦法隊列。

那末我們的辦法簽名(即引入參數和輸入參數)真的必需與拜托完整分歧嗎?答:不是的,我們不克不及疏忽協變與逆變。

我們這裡簡略引見一下協變與逆變的常識。

“協變”是指可以或許應用與原始指定的派生類型比擬,派生水平更年夜的類型。
“逆變”則是指可以或許應用派生水平更小的類型。
那末,我們的拜托也是接收協變與逆變的。
意思是,假如界說一個delegate,那末不只僅簽名完整雷同的辦法可以賦值給delegate變量。
假如一個辦法的參數表相符delegate聲明,但前往的類型是(delegate聲明前往類型)的派生類,那也能夠將這個辦法賦值給這個delegate變量。
假如一個辦法的前往類型相符delegate的聲明,但參數是(delegate聲明參數類型)的先人類,那也能夠將這個辦法賦值給這個delegate變量。
假如一個辦法的參數和前往類型都相符下面兩行的假定,那也能夠將這個辦法賦值給這個delegate變量。

以下以兩個簡略示例說明協變與逆變:

協變:

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,此為協變。 
  } 
}

逆變:

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);
   //拜托引入參數B,而Add辦法參數為A類型,此為協逆變。 
  } 
}

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved