欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

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

C#程序開(kāi)發(fā)入門基礎(chǔ)技術(shù)—delegate(委托)

admin
2024年12月29日 8:20 本文熱度 515

1. 委托的定義和使用

  • 委托的作用:如果要把方法作為函數(shù)來(lái)進(jìn)行傳遞的話,就要用到委托。委托是一個(gè)類型,這個(gè)類型可以賦值一個(gè)方法的引用。C#的委托 通過(guò) delegate 關(guān)鍵字來(lái)聲明。
  • 聲明委托的方式:
    // 第一種方式
    delegate void MyDelegate_1(int x);
    // 第二種方式
    delegate void MyDelegate_2<T>(T x);
  • 使用委托的方式:
    // 第一種方式
    MyDelegate_1 mydelegate = new MyDelegate_1( func );
    // 第二種方式
    MyDelegate_1 mydelegate = func;
委托調(diào)用方法
// 例子
public class Delegate : MonoBehaviour
{
 public delegate void ShowDelegate();
 public delegate double MultiplyDelegate(double x, double y);
 void Start()
    {
 ShowDelegate show = new ShowDelegate(Show_1);
 MultiplyDelegate mul = Multiply;
 // 直接調(diào)用
 show();
 Debug.Log(mul(2f, 3f));
 // 調(diào)用invoke方法
 show.Invoke();
 Debug.Log(mul.Invoke(2f, 3f));
    }
 public void Show_1()
    {
 Debug.Log("Show1");
    }
 public double Multiply(double x, double y)
    {
 return x * y;
    }
}

2. 系統(tǒng)內(nèi)置Action委托

Action委托:

  • Action<T>
    是 .NET Framework 內(nèi)置的泛型委托,可以使用 Action<T>委托以參數(shù)形式傳遞方法,而不用顯式聲明自定義的委托。
  • 封裝的方法必須與此委托定義的方法簽名相對(duì)應(yīng)。即 封裝的方法必須具有一個(gè)通過(guò)值傳遞給它的參數(shù),并且不能有返回值。 還有一種是非泛型委托 Action

注意:

  • Action
    委托至少 0 個(gè)參數(shù),至多 16 個(gè)參數(shù),無(wú)返回值;
  • Action
    表示無(wú)參,無(wú)返回值的委托;
  • Action<int, string>
    表示有傳入?yún)?shù)intstring無(wú)返回值的委托;
  • Action<int, string, bool>
    表示有傳入?yún)?shù)intstringbool無(wú)返回值的委托;
  • Action<int, int, int, int>
    表示有傳入4個(gè)int型參數(shù),無(wú)返回值的委托。
// 案例
// 使用Action、Func等委托時(shí),需要添加 using System;
public class SystemAction : MonoBehaviour
{
    void Start()
    {
        // 無(wú)參
        Action action_1 = Show_1;
        action_1();

        // 帶參
        Action<int, int> action_2 = Show_2;
        action_2(1, 2);

    }
    void Show_1()
    {
        Debug.Log("Show_1");
    }
    void Show_2(int a, int b)
    {
        Debug.Log("Show_2 " + (a + b));
    }
}

3. 系統(tǒng)內(nèi)置Func委托

Func委托:Func是 .NET Framework 內(nèi)置的帶有返回類型的泛型委托

注意:

  • Func
    至少 0 個(gè)輸入?yún)?shù),至多 16 個(gè)輸入?yún)?shù),根據(jù)返回值泛型返回。必須有返回值,不可用void
  • Func<int>
    表示沒(méi)有輸入?yún)?shù),返回值為int類型的委托;
  • Func<object, string, int>
    表示傳入?yún)?shù)為objectstring,返回值類型為int的委托;
  • Func<T1, T2, T3, int>
    表示傳入?yún)?shù)為T1, T2, T3(泛型),返回值為int類型的委托。
/**
 * System.Func 可以不帶參數(shù),但是必須帶一個(gè)返回值
 * System.Func 若是調(diào)用的多個(gè)泛型的委托定義,最后參數(shù)的數(shù)據(jù)類型是函數(shù)的返回值類型,需要保持一致;
 * 非最后一個(gè)泛型的聲明,需要與實(shí)現(xiàn)函數(shù)的參數(shù)個(gè)數(shù)及類型保持一致
 */
public class SystemFunc : MonoBehaviour
{
    void Start()
    {
        // 不帶參數(shù),返回值為string類型
        Func<string> func_1 = Show_1;
        string a = func_1();
        Debug.Log(a);
        // 帶int類型參數(shù),返回值為string類型
        Func<int, string> func_2 = Show_2;
        string b = func_2(100);
        Debug.Log(b);
        // 拋出異常FormatException: Input string was not in a correct format.
        /*Func<string, int > func_3 = Show_3;
        int c = func_3("s");
        Debug.Log(c);*/
    }
    string Show_1()
    {
        return "Show_1";
    }
    String Show_2(int a)
    {
        return a.ToString();
    }
    int Show_3(string x)
    {
        return int.Parse(x);
    }
}

4. 匿名方法、event事件、多播委托

匿名方法:沒(méi)有名字的方法稱之為匿名方法。

Event事件:Event事件本身就是一種委托,只是該委托只能作為類的成員,且不可在類外進(jìn)行調(diào)用。

多播委托:在 C# 語(yǔ)言中,多播委托是指在一個(gè)委托中注冊(cè)多個(gè)方法,在注冊(cè)方法時(shí)可以在委托中使用加號(hào)運(yùn)算符或者減號(hào)運(yùn)算符來(lái)實(shí)現(xiàn)添加或撤銷方法。

/**
 * 1. 匿名事件
 * 2. event事件
 * (1)event事件 只允許作為類的成員變量,且僅在類的內(nèi)部使用才可以,外部不得直接調(diào)用
 * (2)當(dāng)作為一個(gè)類的成員,event事件在外部類賦值時(shí),只能通過(guò) +=/-= 的方式;而對(duì)于普通的Action則可以 =/+=/-=的方式進(jìn)行賦值
 * (3)可通過(guò)在類中定義方法調(diào)用event事件,外部類間接地調(diào)用這個(gè)方法來(lái)調(diào)用event
 * 3. 多播委托 += -=
 * 委托屬于引用類型,引用類型的默認(rèn)值為null,直接使用會(huì)報(bào)空異常;
 * 故在使用之前需要先判斷委托對(duì)象(引用對(duì)象)是否為空
 */
public class MyEventClass
{
    public event Action action_3;
    public Action action_4;

    // event事件調(diào)用
    public void Send()
    {
        if(action_3 != null)
        {
            action_3();
        }
    }
}

public class Broadcast : MonoBehaviour
{
    // event事件
    event Action action_2;

    void Start()
    {
        // Action action = Show_1; 將該語(yǔ)句轉(zhuǎn)為匿名
        Action action = delegate ()  // 匿名函數(shù)
        {
            Debug.Log("匿名函數(shù)被執(zhí)行");
        };
        action();
        // 多播委托
        Action action_1 = Show_1;
        action_1 += Show_2;
        //action_1 -= Show_2;
        //action_1 -= Show_1;
        if (action != null)
        {
            action_1();
        }

        action_2 = Show_1;
        action_2();

        MyEventClass mEvent = new MyEventClass();
        mEvent.action_3 += Show_2;
        mEvent.Send();
        mEvent.action_4 = Show_2;
        mEvent.action_4();
    }
    void Show_1()
    {
        Debug.Log("Show_1被執(zhí)行");
    } 
    void Show_2()
    {
        Debug.Log("Show_2被執(zhí)行");
    }
}

該文章在 2024/12/30 12:41:29 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(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)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(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