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

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

概述

     委托是.NET編程的精髓之一,在日常編程中經(jīng)常用到,在C#中實(shí)現(xiàn)委托主要有Func、Action、delegate三種方式,本節(jié)主要就這三種委托的用法通過(guò)實(shí)例展開(kāi)講解。

Func用法解析

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

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

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委托給它,接下來(lái)執(zhí)行委托并獲取結(jié)果,注意:

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


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

這里的執(zhí)行結(jié)果是: 【func用法1】func返回結(jié)果是:8

用法舉例2: 

用lamda表達(dá)式簡(jiǎn)化寫(xiě)法,通過(guò)+=注冊(cè)實(shí)現(xiàn)多播委托

func += (a, b) =>

{

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

};

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

這里的執(zhí)行結(jié)果是: 【func用法1】func返回結(jié)果是:-2

注意 += 可以注冊(cè)多個(gè)委托,委托執(zhí)行后會(huì)按順序執(zhí)行方法.

Action用法解析

     【Action】:Action是無(wú)返回值的委托:

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

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

用法舉例:

先定義方法:StringAddB

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

實(shí)例如下:

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

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

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

運(yùn)行結(jié)果:

【Action用法】Action執(zhí)行線程id:3

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

delegate用法解析

    【delegate】:delegate是可以有返回值也可以沒(méi)返回值的委托:

使用前需要先聲明:

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

用法舉例

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

以上就是三種委托的區(qū)別和用法講解,那使用委托最大的優(yōu)勢(shì)是什么:

可以將方法當(dāng)作參數(shù)去傳遞,用法舉例如下:

   Test(func, action);//將方法委托后轉(zhuǎn)化為參數(shù)進(jìn)行傳遞

定義方法

     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 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved