C# 中Func 的用法小結(jié)
在 C# 中,F(xiàn)unc 是一個(gè)泛型委托類型,用于表示有返回值的方法,它是 .NET 框架提供的預(yù)定義委托,無(wú)需手動(dòng)聲明即可直接使用。Func 的核心作用是封裝具有特定參數(shù)列表和返回值的方法,常用于 lambda 表達(dá)式、匿名方法或作為方法參數(shù)傳遞,使代碼更簡(jiǎn)潔靈活。
一、基本定義與語(yǔ)法
Func 是泛型委托,定義格式為:
Func<參數(shù)類型1, 參數(shù)類型2, ..., 返回值類型>
特點(diǎn)
- 最少需要指定返回值類型(即至少有 1 個(gè)類型參數(shù),代表返回值)。
- 最多可以有 16 個(gè)輸入?yún)?shù) + 1 個(gè)返回值類型(共 17 個(gè)類型參數(shù))。
- 無(wú)參數(shù)但有返回值時(shí),使用 Func<返回值類型>。
二、常用形式與示例
- 無(wú)參數(shù),有返回值(Func)
// 定義:無(wú)參數(shù),返回string
Func<string> getTime = () => DateTime.Now.ToString("HH:mm:ss");
// 調(diào)用
string currentTime = getTime(); // 結(jié)果:當(dāng)前時(shí)間字符串,如 "15:30:20"
- 1 個(gè)參數(shù),有返回值(Func<T, TResult>)
// 定義:輸入int,返回其平方(int) Func<int, int> square = x => x * x; // 調(diào)用 int result = square(5); // 結(jié)果:25
- 2 個(gè)參數(shù),有返回值(Func<T1, T2, TResult>)
// 定義:輸入兩個(gè)string,返回拼接結(jié)果
Func<string, string, string> combine = (a, b) => $"{a}-";
// 調(diào)用
string str = combine("Hello", "World"); // 結(jié)果:"Hello-World"
- 多參數(shù)(如 3 個(gè)參數(shù))
// 定義:輸入三個(gè)int,返回它們的和 Func<int, int, int, int> sum = (a, b, c) => a + b + c; // 調(diào)用 int total = sum(1, 2, 3); // 結(jié)果:6
三、Func 的典型用法
- 作為方法參數(shù)(傳遞邏輯)
將 Func 作為參數(shù)傳入方法,使方法可以動(dòng)態(tài)執(zhí)行不同邏輯,類似 “回調(diào)函數(shù)”。
// 定義一個(gè)使用Func的方法:對(duì)數(shù)組中的每個(gè)元素執(zhí)行func邏輯并返回新數(shù)組
int[] ProcessArray(int[] array, Func<int, int> func)
{
int[] result = new int[array.Length];
for (int i = 0; i < array.Length; i++)
{
result[i] = func(array[i]); // 執(zhí)行傳入的邏輯
}
return result;
}
// 使用:傳入不同的Func實(shí)現(xiàn)不同功能
int[] numbers = { 1, 2, 3, 4 };
int[] squares = ProcessArray(numbers, x => x * x); // 求平方:[1,4,9,16]
int[] doubles = ProcessArray(numbers, x => x * 2); // 翻倍:[2,4,6,8]
- 配合 LINQ 查詢
LINQ 中大量使用 Func 作為參數(shù),例如 Where、Select 等方法:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Where方法接收Func<int, bool>:篩選出偶數(shù)
var evenNumbers = numbers.Where(n => n % 2 == 0); // 結(jié)果:[2,4]
// Select方法接收Func<int, string>:轉(zhuǎn)換為字符串
var numberStrings = numbers.Select(n => $"數(shù)字:{n}"); // 結(jié)果:["數(shù)字:1", "數(shù)字:2", ...]
- 簡(jiǎn)化復(fù)雜邏輯的封裝
當(dāng)需要多次復(fù)用某段邏輯時(shí),用 Func 封裝可減少代碼冗余:
// 封裝“字符串處理”邏輯
Func<string, string, string> processString = (input, suffix) =>
{
if (string.IsNullOrEmpty(input))
return "默認(rèn)值";
return input.Trim() + suffix;
};
// 多次復(fù)用
string res1 = processString(" test ", "123"); // 結(jié)果:"test123"
string res2 = processString(null, "456"); // 結(jié)果:"默認(rèn)值456"
四、Func 與 Action 的區(qū)別
1.Func:有返回值(至少需要指定返回值類型)。
2. Action:無(wú)返回值(專注于執(zhí)行操作,參數(shù)列表與 Func 類似,但無(wú)返回值類型)。
示例對(duì)比:
// Func(有返回值) Func<int, int> addOne = x => x + 1; // Action(無(wú)返回值) Action<int> printNumber = x => Console.WriteLine(x);
五、總結(jié)
Func 是 C# 中處理 “有返回值的方法封裝” 的強(qiáng)大工具,其核心優(yōu)勢(shì)在于:
- 簡(jiǎn)化代碼:無(wú)需手動(dòng)聲明委托類型,直接使用預(yù)定義的 Func。
- 靈活傳遞邏輯:作為參數(shù)傳遞時(shí),可動(dòng)態(tài)切換方法行為(如 LINQ、回調(diào)函數(shù))。
- 配合 lambda 表達(dá)式:使代碼更簡(jiǎn)潔,可讀性更高。
掌握 Func 的用法,能極大提升 C# 代碼的靈活性和可維護(hù)性,尤其在 LINQ、委托回調(diào)等場(chǎng)景中必不可少。
到此這篇關(guān)于C# 中Func 的用法小結(jié)的文章就介紹到這了,更多相關(guān)C# Func用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity3D應(yīng)用之時(shí)鐘與鐘表小組件的使用教程
這篇文章主要來(lái)和大家詳細(xì)介紹一下Unity3D應(yīng)用開(kāi)發(fā)中的時(shí)鐘和鐘表小組件的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01
C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程
C# 解析JSON道路千萬(wàn)條,其中最流行的還是由Newtonsoft出品的Json.NET,只需要將Json的結(jié)構(gòu)做成C#的class,即可實(shí)現(xiàn)完美的序列化和反序列化,這篇文章主要介紹了C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程,需要的朋友可以參考下2024-03-03
C#基礎(chǔ)語(yǔ)法:Base關(guān)鍵字學(xué)習(xí)筆記
這篇文章主要介紹了C#基礎(chǔ)語(yǔ)法:Base關(guān)鍵字學(xué)習(xí)筆記,本文講解了它的一些基礎(chǔ)知識(shí)以及測(cè)試代碼,需要的朋友可以參考下2015-06-06
Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案
這篇文章主要介紹了Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#中ToString數(shù)據(jù)類型格式大全(千分符)
這篇文章主要介紹了C#中ToString數(shù)據(jù)類型格式大全 千分符,需要的朋友可以參考下2017-02-02
Silverlight實(shí)現(xiàn)星星閃爍動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Silverlight實(shí)現(xiàn)星星閃爍動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
C#使用密封類實(shí)現(xiàn)密封用戶信息的示例詳解
在C#中,密封類(sealed class)是一種不能被其他類繼承的類,它用于防止其他類繼承它的功能和屬性, 下面我們就來(lái)看看如何使用密封類密封用戶的信息吧2024-02-02

