欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中Func委托的實(shí)現(xiàn)

 更新時(shí)間:2025年11月10日 10:11:34   作者:極客智造  
Func是C#中的泛型委托,用于封裝具有返回值的方法,支持最多16個(gè)輸入?yún)?shù),并始終返回最后一個(gè)泛型參數(shù)指定的類(lèi)型,下面就來(lái)詳細(xì)的介紹一下Func委托的使用,感興趣的可以了解一下

Func是 C# 中一種泛型委托(Delegate),用于封裝具有返回值的方法。它是 .NET Framework 中預(yù)定義的委托類(lèi)型,支持最多 16 個(gè)輸入?yún)?shù),并始終返回最后一個(gè)泛型參數(shù)指定的類(lèi)型。以下是其核心知識(shí)點(diǎn)與應(yīng)用場(chǎng)景:

?1.Func的定義與基礎(chǔ)用法

Func 的聲明形式為:

Func<T1, T2, ..., TResult> 
  • ?輸入?yún)?shù)T1, T2, ... 表示方法的輸入?yún)?shù)類(lèi)型(最多 16 個(gè))。
  • ?返回值TResult 表示方法的返回值類(lèi)型。

示例

// 定義一個(gè)接受兩個(gè)整數(shù)參數(shù)并返回字符串的 Func  
Func<int, int, string> SumToString = (a, b) => (a + b).ToString();  
string result = SumToString(3, 5); // 返回 "8"  

應(yīng)用場(chǎng)景

  • ?動(dòng)態(tài)調(diào)用方法:將方法作為參數(shù)傳遞,例如在算法中注入自定義邏輯。
  • ?LINQ 查詢(xún):LINQ 的 Select、Where 等方法依賴(lài) Func 實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換和過(guò)濾。

?2.Func與Action的區(qū)別

  • Func:封裝有返回值**的方法。
  • Action:封裝無(wú)返回值**的方法(即 void 方法)。

示例對(duì)比

// Func 示例  
Func<int, bool> IsEven = num => num % 2 == 0;  
bool check = IsEven(4); // true  
 
// Action 示例  
Action<string> LogMessage = msg => Debug.Log(msg);  
LogMessage("Hello World"); // 輸出到控制臺(tái)  

?3.Func的實(shí)際應(yīng)用場(chǎng)景

(1) 回調(diào)函數(shù)與事件處理

在 Unity 中,Func 可用于定義回調(diào)機(jī)制。例如,實(shí)現(xiàn)一個(gè)異步加載系統(tǒng):

public void LoadResource(string path, Func<bool> onComplete) {  
    StartCoroutine(LoadAsync(path, onComplete));  
}  
 
private IEnumerator LoadAsync(string path, Func<bool> callback) {  
    // 模擬異步加載  
    yield return new WaitForSeconds(2);  
    bool success = true;  
    callback?.Invoke(success); // 調(diào)用回調(diào)函數(shù)  
}  

調(diào)用時(shí):

LoadResource("Assets/Enemy.prefab", (isSuccess) => {  
    if (isSuccess) Debug.Log("加載成功");  
    return true;  
});  

(2) 動(dòng)態(tài)邏輯注入

在策略模式中,通過(guò) Func 實(shí)現(xiàn)靈活的行為切換。例如,敵人 AI 的不同狀態(tài)邏輯:

public class EnemyAI : MonoBehaviour {  
    private Func<EnemyState> _currentBehavior;  
 
    public void SetBehavior(Func<EnemyState> behavior) {  
        _currentBehavior = behavior;  
    }  
 
    void Update() {  
        var state = _currentBehavior?.Invoke();  
        // 根據(jù) state 執(zhí)行動(dòng)作  
    }  
}  
 
// 使用示例  
enemyAI.SetBehavior(() => {  
    if (health < 30) return EnemyState.Flee;  
    return EnemyState.Attack;  
});  

(3) 與 Lambda 表達(dá)式結(jié)合

Func 常與 Lambda 表達(dá)式配合,簡(jiǎn)化代碼:

// 篩選列表中的偶數(shù)  
List<int> numbers = new List<int> { 1, 2, 3, 4 };  
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();  

此處 Where 方法的參數(shù)本質(zhì)上是 Func<int, bool>。

?4. 在 Unity 編輯器擴(kuò)展中的應(yīng)用

雖然 Func 本身不直接涉及編輯器功能,但結(jié)合 Unity 的 API 可實(shí)現(xiàn)高級(jí)擴(kuò)展。例如:

  • ?自定義屬性檢查器:通過(guò) Func 動(dòng)態(tài)生成 Inspector 中的交互邏輯。
  • ?自動(dòng)化測(cè)試工具:用 Func 封裝測(cè)試用例的執(zhí)行條件。

示例:動(dòng)態(tài)生成按鈕并綁定方法(類(lèi)似網(wǎng)頁(yè)1中提到的 OnInspectorGUI 的按鈕邏輯):

[CustomEditor(typeof(MyComponent))]  
public class MyComponentEditor : Editor {  
    public override void OnInspectorGUI() {  
        base.OnInspectorGUI();  
        if (GUILayout.Button("執(zhí)行操作")) {  
            Func<bool> action = () => {  
                // 執(zhí)行復(fù)雜邏輯  
                return true;  
            };  
            bool result = action.Invoke();  
            Debug.Log(result ? "成功" : "失敗");  
        }  
    }  
}  

?5. 注意事項(xiàng)與最佳實(shí)踐

  1. ?性能優(yōu)化:頻繁創(chuàng)建 Func 實(shí)例可能導(dǎo)致內(nèi)存壓力,建議復(fù)用委托或使用靜態(tài)方法。
  2. ?可讀性:避免過(guò)度使用復(fù)雜 Lambda 表達(dá)式,必要時(shí)封裝為具名方法。
  3. ?多線(xiàn)程安全:在 Unity 主線(xiàn)程外調(diào)用 Func 時(shí)需注意線(xiàn)程同(如 MainThreadDispatcher)。

?總結(jié)

Func 是 C# 中實(shí)現(xiàn)方法抽象與靈活調(diào)用的核心工具,適用于回調(diào)、動(dòng)態(tài)邏輯、LINQ 查詢(xún)等場(chǎng)景。在 Unity 開(kāi)發(fā)中,結(jié)合事件系統(tǒng)和編輯器擴(kuò)展,能顯著提升代碼的模塊化與可維護(hù)性。

到此這篇關(guān)于C#中Func委托的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Func委托內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)人民幣大寫(xiě)轉(zhuǎn)換示例代碼

    C#實(shí)現(xiàn)人民幣大寫(xiě)轉(zhuǎn)換示例代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)人民幣大寫(xiě)轉(zhuǎn)換,需要的朋友可以參考使用
    2013-12-12
  • WPF如何繪制光滑連續(xù)貝塞爾曲線(xiàn)示例代碼

    WPF如何繪制光滑連續(xù)貝塞爾曲線(xiàn)示例代碼

    貝塞爾曲線(xiàn),又稱(chēng)貝茲曲線(xiàn)或貝濟(jì)埃曲線(xiàn),一般的矢量圖形軟件通過(guò)它來(lái)精確畫(huà)出曲線(xiàn),下面這篇文章主要給大家介紹了關(guān)于WPF如何繪制光滑連續(xù)貝塞爾曲線(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-04-04
  • C#實(shí)現(xiàn)拆分合并Word表格中的單元格

    C#實(shí)現(xiàn)拆分合并Word表格中的單元格

    我們?cè)谑褂肳ord制作表格時(shí),由于表格較為復(fù)雜,只是簡(jiǎn)單的插入行、列并不能滿(mǎn)足我們的需要。要做一個(gè)完整的表格,很多時(shí)候需要將單元格進(jìn)行拆分或者合并。本文將詳細(xì)為您介紹在Word表格中拆分或合并單元格的思路及方法,希望對(duì)大家有所幫助
    2022-12-12
  • C# 7.0 使用下劃線(xiàn)忽略使用的變量的原因分析

    C# 7.0 使用下劃線(xiàn)忽略使用的變量的原因分析

    這篇文章主要介紹了C# 7.0 使用下劃線(xiàn)忽略使用的變量的原因淺析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 使用C#合并PDF文檔的實(shí)現(xiàn)步驟

    使用C#合并PDF文檔的實(shí)現(xiàn)步驟

    在當(dāng)今的數(shù)字化辦公環(huán)境中,PDF文檔已經(jīng)成為信息交換和存檔的標(biāo)準(zhǔn)格式,然而,在許多業(yè)務(wù)場(chǎng)景中,開(kāi)發(fā)者會(huì)面臨一個(gè)共同的需求:將多個(gè)PDF文檔合并為一個(gè),本文將深入探討如何利用Spire.PDF for .NET 這一強(qiáng)大的工具,幫助C#開(kāi)發(fā)者輕松實(shí)現(xiàn)PDF文檔的合并,需要的朋友可以參考下
    2025-09-09
  • Unity3D實(shí)現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤(pán)

    Unity3D實(shí)現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤(pán)

    這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)鼠標(biāo)控制旋轉(zhuǎn)轉(zhuǎn)盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#正則表達(dá)式的詳細(xì)使用說(shuō)明(附示例代碼)

    C#正則表達(dá)式的詳細(xì)使用說(shuō)明(附示例代碼)

    正則表達(dá)式是一種匹配輸入文本的模式,Net框架提供了允許這種匹配的正則表達(dá)式引擎,模式由一個(gè)或多個(gè)字符、運(yùn)算符和結(jié)構(gòu)組成,這篇文章主要介紹了C#正則表達(dá)式的詳細(xì)使用說(shuō)明,需要的朋友可以參考下
    2025-07-07
  • C#內(nèi)存泄漏的四個(gè)常見(jiàn)場(chǎng)景及其解決辦法

    C#內(nèi)存泄漏的四個(gè)常見(jiàn)場(chǎng)景及其解決辦法

    文章詳解C#內(nèi)存泄漏四大解決策略:資源釋放(using語(yǔ)句)、事件訂閱管理、靜態(tài)集合控制及工具分析,輔以對(duì)象池等高級(jí)技巧,助開(kāi)發(fā)者精準(zhǔn)定位并優(yōu)化內(nèi)存使用
    2025-05-05
  • WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(三)之時(shí)間線(xiàn)(TimeLine)

    WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(三)之時(shí)間線(xiàn)(TimeLine)

    這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之時(shí)間線(xiàn)(TimeLine),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C# WinForm編寫(xiě)一個(gè)六邊形菜單

    C# WinForm編寫(xiě)一個(gè)六邊形菜單

    這篇文章主要為大家詳細(xì)介紹了如何利用C# WinForm編寫(xiě)一個(gè)六邊形菜單,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,有興趣的可以參考下
    2023-09-09

最新評(píng)論