C#中Func委托的實(shí)現(xiàn)
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í)踐
- ?性能優(yōu)化:頻繁創(chuàng)建
Func實(shí)例可能導(dǎo)致內(nèi)存壓力,建議復(fù)用委托或使用靜態(tài)方法。 - ?可讀性:避免過(guò)度使用復(fù)雜 Lambda 表達(dá)式,必要時(shí)封裝為具名方法。
- ?多線(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)換,需要的朋友可以參考使用2013-12-12
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è)谑褂肳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)忽略使用的變量的原因淺析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
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ō)明(附示例代碼)
正則表達(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)存泄漏四大解決策略:資源釋放(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),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

