詳解Func<T>與Action<T>區(qū)別
Func<T>、Action<T> 的區(qū)別于說明
一、Func
Func是一個(gè).Net內(nèi)置的委托。
Func<Result>,F(xiàn)unc<T1,Result>是一個(gè).Net內(nèi)置的泛型委托。
Func<TResult> Func<T,TResult> Func<T1,T2,TResult> Func<T1,T2,T3,TResult> Func<T1,T2,T3,T4,TResult>
它有5種形式,只是參數(shù)個(gè)數(shù)不同;第一個(gè)是無參數(shù),但是有返回值;
下面是一個(gè)簡(jiǎn)單的普通委托來傳方法的示例。
private delegate string Say();
public static string SayHello()
{
return "Hello";
}
static void Main(string[] args)
{
Say say = SayHello;
Console.WriteLine(say());
Console.ReadKey();
}
所以,在有時(shí)候,我們不知道一個(gè)接口同時(shí)要做什么操作的時(shí)候,我可以給它留一個(gè)委托。
為了更方便,.Net直接默認(rèn)有了委托。我們?cè)賮碓囋?Net默認(rèn)帶的委托。
public static string SayHello()
{
return "Hello";
}
static void Main(string[] args)
{
Func<string> say = SayHello;
Console.WriteLine(say());
Console.ReadKey();
}
如果需要參數(shù)的,還可以這樣傳一份。
public static string SayHello(string str)
{
return str + str;
}
static void Main(string[] args)
{
Func<string, string> say = SayHello;
string str = say("abc");
Console.WriteLine(str); //輸出abcabc
Console.ReadKey();
}
二、Action
Action<T>的用法與Func幾乎一樣,調(diào)用方法也類似。
Action Action<T> Action<T1,T2> Action<T1,T2,T3> Action<T1,T2,T3,T4>
private delegate string Say();
public static void SayHello(string str)
{
Console.WriteLine(str);
}
static void Main(string[] args)
{
Action<string> say = SayHello;
say("abc");
Console.ReadKey();
}
三、Func與Action的區(qū)別
Func與Action作用幾乎一樣。只是
Func<Result>有返回類型;
Action<T>只有參數(shù)類型,不能傳返回類型。所以Action<T>的委托函數(shù)都是沒有返回值的。
四、Func與Action都支持Lambda的形式調(diào)用
還是以一個(gè)輸入后,返回重復(fù)一次的值作為示例。
Func<string, string> say = m => m + m;
Console.WriteLine(say("abc")); //輸出abcabc
五、最常見到Func的地方
通常我們最常見到Func是在方法的參數(shù)里如下面這樣:
string XXX(Func<string, string>)
咱們來看看Linq里面的其中一個(gè)Sum:
public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);
里面看到兩點(diǎn):
1、擴(kuò)展方法,與這篇文章無關(guān)(擴(kuò)展的是IEnumerable<TSource>,主要是為了能夠?qū)崿F(xiàn)IEnumerable<TSource>接口的集合.出函數(shù))。
2、Func<TSource, int> selector這個(gè)參數(shù)。
嘗試寫一個(gè)Linq的First函數(shù)吧,命名為First2。Linq源代碼里有很多異常情況處理,好多設(shè)計(jì)模式,可惜我不懂,只提取簡(jiǎn)單邏輯了。
namespace ConsoleApplication2
{
static class Extend
{
public static TSource First2<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
//.Net本身的源代碼好多異常情況處理,好多設(shè)計(jì)模式,我也不懂,只提取邏輯
foreach (TSource item in source)
{
if (predicate(item))
{
return (item);
}
}
throw new Exception("不存在滿足條件的第一個(gè)元素!");
}
}
class Program
{
static void Main(string[] args)
{
List<int> ListInt = new List<int>(){ 1, 2, 3, 4, 5 };
int k = ListInt.First2(m => m > 4); //輸出5
Console.WriteLine(k);
Console.ReadKey();
}
}
}
以上所述是本文的全部?jī)?nèi)容,有問題的可以和小編聯(lián)系,謝謝對(duì)腳本之家的支持!
- C#中Action和Func的區(qū)別
- 使用.NET中的Action及Func泛型委托深入剖析
- SQL Function 自定義函數(shù)詳解
- 深入理解(function(){... })();
- Javascript自執(zhí)行匿名函數(shù)(function() { })()的原理淺析
- JavaScript function函數(shù)種類詳解
- js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別?
- JavaScript獲取function所有參數(shù)名的方法
- seajs加載jquery時(shí)提示$ is not a function該怎么解決
- javascript中$(function() {});寫與不寫有哪些區(qū)別
- jQuery中$(function() {});問題詳解
- PHP register_shutdown_function()函數(shù)的使用示例
- 詳解Python中的裝飾器、閉包和functools的教程
- 用JS動(dòng)態(tài)改變表單form里的action值屬性的兩種方法
- 動(dòng)態(tài)設(shè)置form表單的action屬性的值的簡(jiǎn)單方法
- 詳解在Java的Struts2框架中配置Action的方法
- FloatingActionButton增強(qiáng)版一個(gè)按鈕跳出多個(gè)按鈕第三方開源之FloatingActionButton
- php實(shí)現(xiàn)表單多按鈕提交action的處理方法
- Android 廣播大全 Intent Action 事件詳解
- Codeigniter框架的更新事務(wù)(transaction)BUG及解決方法
相關(guān)文章
ASP.NET Core中如何利用多種方式給Action傳參
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何利用多種方式給Action傳參的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
.NET 開源項(xiàng)目Polly的簡(jiǎn)單介紹
今天介紹一個(gè) .NET 開源庫:Polly,它是支持 .NET Core 的,目前在 GitHub 的 Star 數(shù)量已經(jīng)超過 7 千,它是一個(gè)強(qiáng)大且實(shí)用的 .NET 庫。2021-06-06
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可
ASP.NET數(shù)據(jù)庫編程之處理文件訪問許可...2006-09-09
.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法
.NET運(yùn)行界面上,實(shí)現(xiàn)隨意拖動(dòng)控件的方法,需要的朋友可以參考一下2013-03-03
一天精通asp.net的學(xué)習(xí)經(jīng)驗(yàn)小結(jié)
一天精通asp.net的學(xué)習(xí)經(jīng)驗(yàn)小結(jié)2010-02-02
ASP.NET Core中間件初始化的實(shí)現(xiàn)
在日常使用ASP.NET Core開發(fā)的過程中我們多多少少會(huì)設(shè)計(jì)到使用中間件的場(chǎng)景,本文探究了ASP.NET Core中間件是如何初始化的,感興趣的可以了解一下2021-05-05
.NET Framework常用ORM框架iBatis.Net操作數(shù)據(jù)庫的方法
iBatis.Net 是一個(gè)輕量級(jí)的 ORM 框架,它允許開發(fā)者通過直接編寫 SQL 查詢來操作數(shù)據(jù)庫,并將查詢結(jié)果映射到對(duì)象模型中,本文將通過實(shí)際的代碼示例,詳細(xì)介紹如何在 .NET 環(huán)境中使用 iBatis.Net 進(jìn)行數(shù)據(jù)庫操作,感興趣的朋友一起看看吧2024-08-08
ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件
一直很喜歡 NLog 的簡(jiǎn)潔和擴(kuò)展性,所以下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core開發(fā)教程之Logging利用NLog寫日志文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07

