狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# 實例詳解委托之Func、Action、delegate(精品)

admin
2024年1月23日 12:47 本文熱度 692

概述

     委托是.NET編程的精髓之一,在日常編程中經常用到,在C#中實現委托主要有Func、Action、delegate三種方式,本節主要就這三種委托的用法通過實例展開講解。

Func用法解析

     【Func】:Func是帶返回值的委托:

原型函數如下(以下展示的是有兩個參數的情況):

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

用法舉例1: 定義方法StringAddA

public int StringAddA(string a, string b)

{

    return int.Parse(a) + int.Parse(b);

}

定義委托func,然后把方法StringAddA委托給它,接下來執行委托并獲取結果,注意:

Func<string, string, int> func = StringAddA;


Func<string, string, int> func = new Func<string, string, int>(StringAddA);
的簡寫
Func<string, string, int> func = StringAddA;//簡寫
var result = func.Invoke("3", "5");//可以簡化為func("3", "5")
sw.AppendLine($"【func用法1】func返回結果是:{result}");

這里的執行結果是: 【func用法1】func返回結果是:8

用法舉例2: 

用lamda表達式簡化寫法,通過+=注冊實現多播委托

func += (a, b) =>

{

return int.Parse(a) - int.Parse(b);

};

sw.AppendLine($"【func用法2】func返回結果是:{func("3", "5")}");

這里的執行結果是: 【func用法1】func返回結果是:-2

注意 += 可以注冊多個委托,委托執行后會按順序執行方法.

Action用法解析

     【Action】:Action是無返回值的委托:

原型函數如下(以下展示的是有兩個參數的情況):

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

用法舉例:

先定義方法:StringAddB

    public void StringAddB(string a, string b)
    {
       sw.AppendLine($"【Action用法】Action執行結果:{(int.Parse(a) + int.Parse(b))}");
    }

實例如下:

 Action<string, string> action = StringAddB;//簡寫
 IAsyncResult asyncResult = action.BeginInvoke("3", "5", null, null);//action("3", "5"),BeginInvoke異步執行,即:開啟新現成處理StringAddB
 action.EndInvoke(asyncResult);//阻塞委托,直到執行完成
 if (asyncResult.IsCompleted)
 {
     sw.AppendLine($"【Action用法】當前異步委托線程已執行完成");
 }

這里BeginInvoke是異步委托,即新開線程去處理,我們的窗體線程在1號線程,這里我們可以在StringAddB里面打印線程id號

sw.AppendLine($"【Action用法】Action執行線程id:{Thread.CurrentThread.ManagedThreadId}");

運行結果:

【Action用法】Action執行線程id:3

這里的EndInvoke是阻塞委托,直到執行完成,當然我們這里也可以用同步的Invoke去執行,甚至Invoke都可以簡寫去掉,直接寫成action("3", "5")

delegate用法解析

    【delegate】:delegate是可以有返回值也可以沒返回值的委托:

使用前需要先聲明:

 delegate int DelegateM(string a, string b);//聲明,可以有返回值也可以沒有

用法舉例

   //delegate用法
   //DelegateM delegateM = new DelegateM(p.StringAddA);
   DelegateM delegateM = StringAddA;//簡寫
   sw.AppendLine($"【delegate用法】delegate返回結果是:{delegateM("3", "5")}");

以上就是三種委托的區別和用法講解,那使用委托最大的優勢是什么:

可以將方法當作參數去傳遞,用法舉例如下:

   Test(func, action);//將方法委托后轉化為參數進行傳遞

定義方法

     public void Test(Func<string, string, int> f, Action<string, string> a)
     {
         a.Invoke(f.Invoke("3", "5").ToString(), "5");
     }

該文章在 2024/1/23 12:47:02 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved