91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中委托和匿名委托有什么用

發布時間:2021-03-06 12:45:51 來源:億速云 閱讀:156 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關C#中委托和匿名委托有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Lambda表達式從我接觸開始到現在變得越來越流行,Java8中開始支持、kotlin更是對C#,F#做了廣泛的抄襲(C#曾幾何時不也如此對待過Java嘛)。其實這都充分說明了,Lambda表達式的重要性。要搞清楚Lambda首先需要搞清楚委托。

委托:

假設現在我們要開發一個處理兩個整數的程序(假設先處理相加操作)

public class Worker
    {
      /// <summary>
      /// 處理兩個數
      /// </summary>
      /// <param name="a"></param>
      /// <param name="b"></param>
      /// <returns></returns>
      public int HandleTwoNumber(int a,int b)
      {
        return a + b;
      }
    }
static void Main(string[] args)
    {
      int a = int.Parse(Console.ReadLine());
      int b = int.Parse(Console.ReadLine());

      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(a, b);
      Console.WriteLine(String.Format("Result:{0}", result));

      string p = Console.ReadLine();
}

如果一段時間后,我們需要它變更為減操作:

public class Worker
    {
      public int HandleTwoNumber(int a,int b)
      {
        return a - b;
      }
    }

雖然有a+b變為a-b的變化很微小,但后續此處可能面臨多次變化(由減變為除.........)。有變化就應封裝變化,此處我們可以將a與b的操作行為抽象出來,用什么抽象呢?委托

public class Worker
    {
      public delegate int TwoNumberHandleMethodDelegate(int x, int y);
      public int HandleTwoNumber(int a,int b)
      {
        return a + b;
      }
    }

public delegate int TwoNumberHandleMethodDelegate(int x, int y);此處用delegate標注,表明這是一個委托定義。如果去掉 delegate 再來觀察該定義,你會發現這就是一個沒有方法體的抽象方法。所以委托的含義即:與該抽象方法簽名形式相同的方法的類型。委托就是一種你定義的新數據類型,它與int、class是一樣的都是數據類型。int表示整數,只要是整數都可以賦值給 int型變量;TwoNumberHandleMethodDelegate則表示,接收兩個int型參數并返回int型結果的這類方法,因此滿足上述要求的方法都可賦值給TwoNumberHandleMethodDelegate類型的變量。

如此一來Worker代碼可修改為:

public class Worker
    {
      public delegate int TwoNumberHandleMethodDelegate(int x, int y);
      public int HandleTwoNumber(int a, int b, TwoNumberHandleMethodDelegate handle)
      {
        return handle(a, b);
      }
    }

如此a、b的操作被封裝起來,所有的變化均交由調用者來處理。此處的含義:HandleTwoNumber處理a、b兩個整數,具體如何處理由 handle 實施。此時你可能會問,那如何來調用該方法呢?調用如下:

private static int Add(int a, int b)
    {
      return a + b;
    }

    private static int Sub(int a, int b)
    {
      return a - b;
    }

    static void Main(string[] args)
    {
      int a = int.Parse(Console.ReadLine());
      int b = int.Parse(Console.ReadLine());
      Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(10, 10,method);
       //int result = worker.HandleTwoNumber(10, 10, Sub);//簡化版
      Console.WriteLine(String.Format("Result:{0}", result));
 }

根據上面的程序可知,Main代碼塊為worker的調用者,作為調用者而言應該最清楚自己想要讓woker做的工作。因此作為被調用者的worker而言,它只需要接收調用者Main給的a\b參數及執行Main定制的算法method,然后按照算法執行并返回結果即可。上面代碼雖然簡單,但其中的意義深遠,隨著編程時間的增加相信你的理解將越深刻。

委托變量在進行賦值時除了標準的方式,還可以進行簡化:

Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(10, 10,method);
//可簡化為
// int result = worker.HandleTwoNumber(10, 10,Add);

編譯器將自動檢查Add是否符合 TwoNumberHandleMethodDelegate 的定義,如果符合允許直接將方法名賦值給委托變量。

匿名委托

通過上面的示例代碼,我們很容易發現 TwoNumberHandleMethodDelegate method 變量被賦值為Add(Sub),因此在調用method(...)時相當于調用Add(.....)。這樣一來就可以認為

method與Add完全等效,既然等效那是否可以直接將Add的定義內容賦值給method變量呢?答案是肯定的:

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =private static int Add(int a, int b)
    {
      return a + b;
    };
}

但像上面這種生拉硬套是不行的,你還需要做修改。修改內容是:因為現在的代碼處于Main方法中,訪問修飾符去掉,同樣static也應去掉;同時編譯器知道你要給method賦值,那么要賦的這個值肯定滿足返回類型為int的要求,所有int在此時就多余了去掉;因為賦值之后method就等效于Add,以后調用只要通過method變量就可完成,所有Add方法名不需要去掉。如此代碼變為如下形式:

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =  (int a, int b)
    {
      return a + b;
    };
}

經過上面的修改內容簡化了很多,但method賦值的=右端是什么東西呢?此時編譯器并不能正確識別這是一個方法,因為方法的定義需要滿足包含:訪問修身符、返回類型、方法名、參數列表、方法體五部分內容。雖然你心里清楚這是個簡化了的方法,但是編譯器不懂你的心.........,那沒關系只要我們告訴編譯器,后面的是個簡化方法就可以了。

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =  delegate(int a, int b)
    {
      return a + b;
    };
}

正如你所期望的那樣,現在編譯器已經知道了=右側是你經過簡化的方法;ok,現在可以正常賦值并使用了。

通過上面的定義我們發現,用delegate標注的簡化方法沒有一個像Add/Sub一樣固定的名字。因此我們稱這種方法叫匿名委托(我習慣稱匿名方法)。

你可能還注意到該匿名委托定義完畢后就賦值給Main代碼快中的局部變量method,因此當超出method的作用域后,該方法就再也沒有機會調用了。這引出了匿名方法、匿名委托、匿名函數它們的最常見用法,即用來定義只需要使用一次的功能代碼。

關于“C#中委托和匿名委托有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

濮阳县| 凤翔县| 都匀市| 土默特右旗| 保德县| 石台县| 彝良县| 大余县| 永年县| 清流县| 莒南县| 新兴县| 神木县| 都兰县| 宁强县| 八宿县| 吴旗县| 清远市| 平和县| 鄯善县| 平乐县| 巨野县| 阳城县| 陇南市| 廉江市| 万全县| 云阳县| 凤阳县| 西充县| 石楼县| 上思县| 晋州市| 灌云县| 广汉市| 吐鲁番市| 昆山市| 富蕴县| 丰镇市| 苍梧县| 墨竹工卡县| 托克托县|