最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對c#中托的理解

 更新時間:2013年04月12日 15:46:23   投稿:jingxian  
本篇文章,小編將為大家介紹關(guān)于對c#中托的理解,有需要的朋友可以參考一下

理解托從一個簡單的例子開始

復(fù)制代碼 代碼如下:

public class LoveManager
{
    public void Love(string name)
    {
        Console.WriteLine("我愛你, {0}", name);
    }
}

復(fù)制代碼 代碼如下:

class Program
{
    static void Main(string[] args)
    {
        LoveManager loveManager = new LoveManager();
        loveManager.Love("張曼玉");
    }
}

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

我愛你, 張曼玉

我留意到后來電影里出現(xiàn)了外國客戶,我想代碼應(yīng)該是這樣:

復(fù)制代碼 代碼如下:

//枚舉,可擴展多語種
public enum Language
{
    English,
    Chinese
}

復(fù)制代碼 代碼如下:

public class LoveManager
{
    public void Love(string name, Language lang)
    {
        switch (lang)
        {
            case Language.Chinese:
                loveChinese(name);
                break;
            case Language.English:
                loveEnglish(name);
                break;
        }
    }

    //漢語客戶專用
    public void LoveChinese(string name)
    {
        Console.WriteLine("我愛你, {0}", name);
    }

    //英語客戶專用
    public void LoveEnglish(string name)
    {
        Console.WriteLine("I love you, {0}", name);
    }
}

復(fù)制代碼 代碼如下:

class Program
{
    static void Main(string[] args)
    {
        LoveManager loveManager = new LoveManager();
        loveManager.Love("張曼玉", Language.Chinese);
        loveManager.Love("Sophie Marceau", Language.English);
    }
}

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

我愛你, 張曼玉
I love you, Sophie Marceau

OK,現(xiàn)在張曼玉能聽懂“我愛你”,Sophie Marceau能聽懂“I love you”。雖然支持了英漢雙語表白,但以后還有法國客戶,葡萄牙客戶,客戶怎么辦?每擴展一個語種除了添加這個語種“我愛你”的方法,還得擴展枚舉,擴展LoveManager.Love(),確實有些繁瑣。

C語言時代:指針

此時,不得不提到C語言中大名鼎鼎的指針。指針允許把一個函數(shù)的地址作為參數(shù)傳遞給另一個函數(shù),這個特性在以后的各種高級語言中得到了擴展和加強。先看如下C代碼:

復(fù)制代碼 代碼如下:

#include <stdio.h>

//接受一個指針類型的參數(shù)
void func1(void(*p)(void)){
    printf("this is func1\r\n");
    //通過指針調(diào)用函數(shù)
    p();
}

void func2(){
    printf("this is func2\r\n");
}

int main() {
    //將func2地址作為參數(shù)傳遞
    func1(func2);
    return 0;
}

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

this is func1
this is func2

在.Net中能不能像C語言一樣,把函數(shù)作為一個參數(shù)傳遞并且調(diào)用呢?

復(fù)制代碼 代碼如下:

//這段代碼并不能被執(zhí)行,但如果在.Net中可以這樣寫的話問題就會簡單很多 Love("張曼玉", LoveChinese);
Love("Sophie Marceau", LoveEnglish);

.Net中更完美的解決方案:托

在.Net中不但可以像C語言一樣將函數(shù)作為參數(shù)傳遞,并且.Net提供了類型安全機制和更加強大的功能,如下提供了使用托的完整代碼示例:

復(fù)制代碼 代碼如下:

using System;

namespace DelegateDemo
{
    //定義托
    public delegate void LoveDelegate(string name);

    public class LoveManager
    {
        public void Love(string name, LoveDelegate loveDelegate)
        {
            loveDelegate(name);
        }

        //漢語客戶專用
        public void LoveChinese(string name)
        {
            Console.WriteLine("我愛你, {0}", name);
        }

        //英語客戶專用
        public void LoveEnglish(string name)
        {
            Console.WriteLine("I love you, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            LoveManager loveManager = new LoveManager();
            loveManager.Love("張曼玉", loveManager.LoveChinese);
            loveManager.Love("Sophie Marceau", loveManager.LoveEnglish);
        }
    }
}

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

我愛你, 張曼玉
I love you, Sophie Marceau

定義托

復(fù)制代碼 代碼如下:

public delegate void LoveDelegate(string name);

我們現(xiàn)在對托做一個總結(jié):
托是一個類,它定義了方法的類型,使得可以將方法當(dāng)作另一個方法的參數(shù)來進行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
 
在C#中托使用特有的關(guān)鍵字 delegate 來定義,在delegate之后緊跟的是函數(shù)簽名。為了確保類型安全,.Net中的托要求函數(shù)具有相同的簽名,比如 func(int p) 和func(string p)不能使用同一個托,因為它們的參數(shù)類型不一樣。

通過ILDasm.exe可以發(fā)現(xiàn),定義托的那行代碼實際在編譯時會自動生成一個類,如果要還原這個類,代碼是這樣:

復(fù)制代碼 代碼如下:

public class LoveDelegate : System.MulticastDelegate
{
      //構(gòu)造器
      public LoveDelegate(Object obj, IntPtr method);

      //原型
      public virtual void Invoke(string name);

      //異步回調(diào)
      public virtual IAsyncResult BeginInvoke(Int32 value, AsyncCallback callback, Object obj);
      public virtual void EndInvoke(IAsyncResult result);
}

因此,托實際上就是一個類,它繼承至System.MulticastDelegate,凡是可以定義類的地方,都可以定義托。

托的構(gòu)造函數(shù)

復(fù)制代碼 代碼如下:

LoveManager loveManager = new LoveManager();
//編譯不能通過,托必須使用帶有一個參數(shù)的構(gòu)造函數(shù)
//LoveDelegate loveDelegate = new LoveDelegate();
LoveDelegate loveDelegate = new LoveDelegate(loveManager.LoveChinese);
loveDelegate("吳劍");

與類不同的是,托必須使用帶有一個參數(shù)的構(gòu)造函數(shù)。

托推斷語法

復(fù)制代碼 代碼如下:

LoveManager loveManager = new LoveManager();
//等同于:LoveDelegate loveDelegate = new LoveDelegate(loveManager.LoveChinese);
LoveDelegate loveDelegate = loveManager.LoveChinese;
loveDelegate("吳劍");

托與方法進行綁定

回到上面的例子,有一天一富二代找到小金,說錢不是問題,你去張曼玉樓下,用中文喊一遍,再用英文喊一遍。

復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
        LoveManager loveManager = new LoveManager();
        //定義托變量
        LoveDelegate delegate1;
        //變量初始化(用中文喊一遍)
        delegate1 = loveManager.LoveChinese;
        //綁定方法(用英文再喊一遍)
        delegate1 += loveManager.LoveEnglish;
        delegate1("張曼玉");
}

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

我愛你, 張曼玉
I love you, 張曼玉

我們可以用 += 將多個方法綁定到一個托,也可以使用  -= 移除方法與托的綁定。

匿名方法

客戶的需求總是千變?nèi)f化,一個客戶跟小金說,我要跟曼玉表白,除了用中英文,能不能后面再給我加一句,曼玉一聽到這句準(zhǔn)會答應(yīng)我。

復(fù)制代碼 代碼如下:

LoveManager loveManager = new LoveManager();
LoveDelegate loveDelegate = loveManager.LoveEnglish;
loveDelegate += loveManager.LoveChinese;
loveDelegate += delegate(string name)
{
    Console.WriteLine("{0}, 還記得大明湖畔的夏雨荷嗎?", name);
};
loveDelegate("曼玉");

執(zhí)行結(jié)果:

復(fù)制代碼 代碼如下:

I love you, 曼玉
我愛你,曼玉
曼玉,還記得大明湖畔的夏雨荷嗎?

針對這位特殊客戶使用了匿名方法,不是每個人示愛的時候都會提到大明湖畔的夏雨荷,也就是這位特殊客戶使用一次而以,所以沒有必要定義一個方法。使用匿名方法可以減少編碼量,降低代碼復(fù)雜度。

Lambda(λ)表達式

C# 3.0為匿名方法提供了Lambda表達式,如下代碼執(zhí)行結(jié)果與上面的示例完全一致:

復(fù)制代碼 代碼如下:

LoveManager loveManager = new LoveManager();
LoveDelegate loveDelegate = loveManager.LoveEnglish;
loveDelegate += loveManager.LoveChinese;
//用紅色字體標(biāo)出了Lambda表達式部分loveDelegate += name =>
{
    Console.WriteLine("{0}, 還記得大明湖畔的夏雨荷嗎?", name);
};
loveDelegate("曼玉");

=>為Lambda運算符,運算符左邊列出匿名方法需要的參數(shù),可以這樣使用:

(string param1, int param2)

也可以:

(param1, param2)

如示例代碼只有一個參數(shù)還可以去掉括號:

param1

Lambda表達式右邊為匿名方法實現(xiàn)代碼,如果實現(xiàn)代碼只有一行,還可以刪除花括號和return語句,因為編譯器會自動添加。

共同學(xué)習(xí),共同進步!

相關(guān)文章

  • C#實現(xiàn)五子棋游戲

    C#實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C#使用非托管代碼直接修改字符串的方法

    C#使用非托管代碼直接修改字符串的方法

    在string方法中,如ToUpper等字符串操作方法,都會產(chǎn)生一個新的字符串,這樣增大了運行開支。一個替代方案是通過非托管代碼直接操作字符串。如替代ToUpper方法:
    2013-07-07
  • C#實現(xiàn)帶百分比的進度條功能示例

    C#實現(xiàn)帶百分比的進度條功能示例

    這篇文章主要介紹了C#實現(xiàn)帶百分比的進度條功能,分析了帶百分比進度條的功能需求并結(jié)合實例形式給出了具體實現(xiàn)步驟與相關(guān)操作方法,需要的朋友可以參考下
    2017-05-05
  • WPF自定義控件實現(xiàn)ItemsControl魚眼效果

    WPF自定義控件實現(xiàn)ItemsControl魚眼效果

    這篇文章主要為大家詳細(xì)介紹了WPF如何通過自定義控件實現(xiàn)ItemsControl魚眼效果,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2024-01-01
  • C#獲取動態(tài)生成的CheckBox值

    C#獲取動態(tài)生成的CheckBox值

    checkbox是VS2012的常用控件之一,可以方便的為某些功能取消或啟用,下面教你如何簡單使用checkbox。本文通過兩種方法給大家介紹,需要的朋友一起看看吧
    2015-09-09
  • C#最簡單的關(guān)閉子窗體更新父窗體的實現(xiàn)方法

    C#最簡單的關(guān)閉子窗體更新父窗體的實現(xiàn)方法

    原理就是將子窗體最為對話框模式彈出,當(dāng)窗體關(guān)閉或取消時更新主窗體
    2012-11-11
  • C#實現(xiàn)網(wǎng)頁畫圖功能

    C#實現(xiàn)網(wǎng)頁畫圖功能

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)網(wǎng)頁畫圖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C#獲取HTML文本的第一張圖片與截取內(nèi)容摘要示例代碼

    C#獲取HTML文本的第一張圖片與截取內(nèi)容摘要示例代碼

    在日常web開發(fā)的時候,經(jīng)常會遇到需要獲取保存的HTML文本中的第一張圖片,并且截取內(nèi)容摘要的效果,例如織夢的后臺添加完詳細(xì)內(nèi)容后就是自動讀取內(nèi)容摘要,并保存第一張圖片為縮略圖,那么這篇文章跟大家分享下利用C#如何實現(xiàn),感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • C#中實現(xiàn)多繼承的方法

    C#中實現(xiàn)多繼承的方法

    這篇文章主要介紹了C#中實現(xiàn)多繼承的方法,本文通過給接口添加擴展的方法實現(xiàn)了C#的多繼承,需要的朋友可以參考下
    2014-08-08
  • C#使用selenium實現(xiàn)爬蟲

    C#使用selenium實現(xiàn)爬蟲

    這篇文章介紹了C#使用selenium實現(xiàn)爬蟲的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

白河县| 巴彦淖尔市| 寿光市| 大悟县| 麻城市| 彩票| 东光县| 南投县| 道真| 石台县| 东乡| 玉环县| 剑河县| 巴彦县| 开平市| 延川县| 棋牌| 苏尼特右旗| 德钦县| 泽普县| 浙江省| 福鼎市| 大悟县| 八宿县| 特克斯县| 抚松县| 和顺县| 文水县| 丰县| 张北县| 通化县| 图木舒克市| 博客| 霍州市| 黔西县| 新津县| 县级市| 开江县| 罗源县| 苍梧县| 柳河县|