最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#函數(shù)式編程中的部分應(yīng)用詳解

 更新時(shí)間:2015年01月28日 09:46:50   投稿:junjie  
這篇文章主要介紹了C#函數(shù)式編程中的部分應(yīng)用詳解,本文講解了何謂函數(shù)式編程、函數(shù)式編程中的部分應(yīng)用是什么、部分應(yīng)用的代碼實(shí)例,需要的朋友可以參考下

何謂函數(shù)式編程

相信大家在實(shí)際的開(kāi)發(fā)中,很多情況下完成一個(gè)功能都需要借助多個(gè)類,那么我們這里的基本單元就是類。而函數(shù)式編程則更加細(xì)化,致使我們解決一個(gè)功能的基本單元是函數(shù),而不是類,每個(gè)功能都是由多個(gè)函數(shù)構(gòu)成,并且函數(shù)之間沒(méi)有直接的關(guān)系。如果簡(jiǎn)單的文字描述還不足以讓你理解,下面我們就配以圖來(lái)演示。

如下圖所示,圖左是我們?cè)O(shè)計(jì)好的三個(gè)函數(shù),而右邊則是我們需要實(shí)現(xiàn)的功能。而我們需要做的就是利用這三個(gè)函數(shù)去完成對(duì)應(yīng)的三個(gè)功能,筆者在這里只是進(jìn)行簡(jiǎn)單而又形象的表述,實(shí)際的開(kāi)發(fā)過(guò)程可能需要更多的函數(shù),并且需要使用不同的函數(shù)式編程的方式組合才能完成對(duì)應(yīng)的功能。

后面我們假設(shè)F1和F2進(jìn)行組合可以完成功能G1,那么結(jié)果就如下圖所示:

對(duì)應(yīng)的其他功能我們依然是按照上面的方式進(jìn)行組合就可以完成對(duì)應(yīng)的功能,這樣做必然有其對(duì)應(yīng)的優(yōu)點(diǎn),對(duì)筆者而言最大的優(yōu)點(diǎn)就是函數(shù)不受外部環(huán)境的影響,這里我們不能與類中的方法相提并論,因?yàn)榉椒〞?huì)受到類上下文變量的影響,特別是在多線程的情況下會(huì)出現(xiàn)共享讀和寫的問(wèn)題,而函數(shù)則不會(huì),因?yàn)樗皇峭ㄟ^(guò)參數(shù)的方式接收外部的變量,還有一點(diǎn)就是復(fù)用性很強(qiáng),如果前期設(shè)計(jì)的充分,在后期開(kāi)發(fā)過(guò)程中函數(shù)可以發(fā)揮到最大的作用。說(shuō)了這么多廢話,下面我們就可以開(kāi)始我們的函數(shù)式編程的第一部分——部分應(yīng)用。

部分應(yīng)用

各位不用被這個(gè)名詞嚇壞,他主要是將我們多個(gè)參數(shù)的函數(shù)進(jìn)行拆分,拆成多個(gè)只有一個(gè)參數(shù)的函數(shù),比如下面這個(gè)函數(shù),我們正常寫的話都是這樣寫的:

復(fù)制代碼 代碼如下:

Func<int, int, int> Add = (x, y) => x + y;

怎么調(diào)用相信筆者就不需要過(guò)多介紹了,下面我們就要讓他能夠支持部分應(yīng)用:

復(fù)制代碼 代碼如下:

Func<int, Func<int, int>> Add = x => y => x + y;

這下就應(yīng)該明白了吧,只是在接收了一個(gè)值之后返回了下一個(gè)函數(shù),然后我們?cè)僬{(diào)用這個(gè)返回的函數(shù)就完成整個(gè)調(diào)用,我們是不是部分使用了這個(gè)函數(shù)?所以叫部分應(yīng)用。下面我們來(lái)看看怎么使用這個(gè)函數(shù):

復(fù)制代碼 代碼如下:

var Add2 = Add(2);
var result = Add2(4);

這樣分成兩行比較容易看懂,但是我們可以僅僅使用一行就可以了,比如下面這個(gè)方式:

復(fù)制代碼 代碼如下:

var result = Add(2)(5);

哇,是不是瞬間感覺(jué)高大上了,如果我們這個(gè)方法的參數(shù)再多點(diǎn),就是括號(hào)加括號(hào),相信別人看到你這行代碼后就會(huì)呵呵了,然后心里一萬(wàn)個(gè)“某某”馬奔騰。

我去,看到這的人會(huì)可能會(huì)吹噓這又沒(méi)有什么太特別的東西,就是函數(shù)返回函數(shù)。對(duì)就是函數(shù)返回函數(shù),但是實(shí)際運(yùn)用起來(lái)你就會(huì)發(fā)現(xiàn)舒暢多了,下面筆者簡(jiǎn)單的舉一個(gè)比較靠譜的例子來(lái)說(shuō)明部分應(yīng)用能夠帶給我們什么,比如我們經(jīng)常需要執(zhí)行SQL語(yǔ)句,當(dāng)然需要使用SqlConnection,然后附加上對(duì)應(yīng)的SQL語(yǔ)句,為此我們可以開(kāi)發(fā)一個(gè)簡(jiǎn)單的函數(shù),用來(lái)簡(jiǎn)化這一過(guò)程:

復(fù)制代碼 代碼如下:

Func<SqlConnection, Func<String, DataSet>> ExecSql = x => y =>
                    {
                        using (x)
                        {
                            x.Open();
                            var com = x.CreateCommand();
                            DataSet ds = new DataSet();
                            com.CommandText = y;
                            SqlDataAdapter adapter = new SqlDataAdapter(com);
                            adapter.Fill(ds);
                            return ds;
                        }
                    };

然后調(diào)用起來(lái)就簡(jiǎn)單多了,我們只要傳遞給對(duì)應(yīng)的SqlConnection對(duì)象,然后對(duì)應(yīng)的返回值我們就可以用來(lái)執(zhí)行我們的SQL語(yǔ)句了,具體的使用示例如下所示:

復(fù)制代碼 代碼如下:

var esql = ExecSql(new SqlConnection("xxx"));
var rds = esql("select xxxx from xxx");
rds = esql("select ffff from ffff");

但是做到這還沒(méi)有結(jié)束,面對(duì)那些總是想出奇怪問(wèn)題的人,我們還有一個(gè)需要做,就是我們可能先要傳遞SQL語(yǔ)句,然后再傳遞對(duì)應(yīng)的SqlConnection對(duì)象,沒(méi)問(wèn)題,我們專門為此寫個(gè)函數(shù):

復(fù)制代碼 代碼如下:

Func<String, Func<SqlConnection, DataSet>> ExecSqlT = x => y => ExecSql(y)(x);

我們就繼續(xù)該怎么調(diào)用就調(diào)用吧,但是上面都是從一開(kāi)始就利用部分應(yīng)用的方式來(lái)寫,實(shí)際情況可能是已經(jīng)寫好的普通的方式,需要轉(zhuǎn)換成部分應(yīng)用的方式。那么下面我們可以自己先手動(dòng)的寫幾個(gè)擴(kuò)展,以便于以后的使用,首先我們來(lái)寫存在兩個(gè)參數(shù)和返回值的擴(kuò)展:

復(fù)制代碼 代碼如下:

public static class Functional
    {
        public static Func<T1, Func<T2, T3>> Currey<T1, T2, T3>(this Func<T1, T2, T3> func)
        {
            return x => y => func(x, y);
        }
}

有了這個(gè)擴(kuò)展之后我們?cè)侔焉厦娴睦痈膶懀?br />

復(fù)制代碼 代碼如下:

var ExecSql = Functional.Currey<SqlConnection, String, DataSet>((x, y) =>
                    {
                        using (x)
                        {
                            x.Open();
                            var com = x.CreateCommand();
                            DataSet ds = new DataSet();
                            com.CommandText = y;
                            SqlDataAdapter adapter = new SqlDataAdapter(com);
                            adapter.Fill(ds);
                            return ds;
                        }
                    });

這樣我們就可以按照我們正常的形式來(lái)寫,然后調(diào)用Functional的Currey就可以了,當(dāng)然這里需要顯示的傳遞泛型參數(shù),有些情況下則不需要。

如果需要擴(kuò)展更多參數(shù)的可以對(duì)應(yīng)的寫下去就可以了。當(dāng)然上面僅僅只是針對(duì)沒(méi)有參數(shù)的情況,我們也可以對(duì)Action也進(jìn)行擴(kuò)展:

復(fù)制代碼 代碼如下:

public static Func<T1, Action<T2>> Currey<T1, T2>(this Action<T1, T2> func)
{
    return x => y => func(x, y);
}

到此我們就解決了將普通函數(shù)轉(zhuǎn)換成部分應(yīng)用方式的函數(shù),但是問(wèn)題就來(lái)了。如果我們一開(kāi)始寫的是部分應(yīng)用方式的函數(shù),怎么將其轉(zhuǎn)換成普通的函數(shù)呢?自然我們還需要下面的擴(kuò)展能夠?qū)⑵滢D(zhuǎn)換回去:

復(fù)制代碼 代碼如下:

public static Func<T1, T2, T3> UnCurrey<T1, T2, T3>(this Func<T1, Func<T2, T3>> func)
{
    return (x, y) => func(x)(y);
}

相關(guān)文章

  • C#給多線程傳參的幾種方式小結(jié)

    C#給多線程傳參的幾種方式小結(jié)

    本文詳細(xì)探討了如何在C#中進(jìn)行線程傳參,包括啟動(dòng)線程時(shí)如何將參數(shù)傳遞給線程函數(shù),以及在多線程環(huán)境下正確使用參數(shù)的方法,對(duì)于理解和實(shí)踐C#線程編程具有重要意義,需要的朋友可以參考下
    2024-10-10
  • c#判斷email地址是否為合法

    c#判斷email地址是否為合法

    輸入email地址使用c#語(yǔ)言檢測(cè)出email地址是否是合法的,這篇文章主要介紹了c#判斷email地址是否為合法的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • C#中緩存System.Web.Caching用法總結(jié)

    C#中緩存System.Web.Caching用法總結(jié)

    本文詳細(xì)講解了C#中緩存System.Web.Caching的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 舉例講解C#編程中對(duì)設(shè)計(jì)模式中的單例模式的運(yùn)用

    舉例講解C#編程中對(duì)設(shè)計(jì)模式中的單例模式的運(yùn)用

    這篇文章主要介紹了C#編程中對(duì)設(shè)計(jì)模式中的單例模式的運(yùn)用,單例模式在.NET框架的相關(guān)開(kāi)發(fā)中也被經(jīng)常用到,需要的朋友可以參考下
    2016-02-02
  • WinForm實(shí)現(xiàn)自定義右下角提示效果的方法

    WinForm實(shí)現(xiàn)自定義右下角提示效果的方法

    這篇文章主要介紹了WinForm實(shí)現(xiàn)自定義右下角提示效果的方法,涉及WinForm自定義提示效果的實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • c# 進(jìn)程之間的線程同步

    c# 進(jìn)程之間的線程同步

    這篇文章主要介紹了c# 進(jìn)程之間的線程同步,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10
  • C#編程和Visual Studio使用技巧(上)

    C#編程和Visual Studio使用技巧(上)

    C#是一門偉大的編程語(yǔ)言,與C++和Java相比,它的語(yǔ)法更簡(jiǎn)單,相對(duì)來(lái)說(shuō)更好入門。Visual Studio作為.Net平臺(tái)上最重量級(jí)的IDE,也通過(guò)不斷的更新為開(kāi)發(fā)者帶來(lái)更出色的開(kāi)發(fā)體驗(yàn)。本文將介紹10個(gè)C#編程和Visual Studio IDE使用技巧。
    2015-10-10
  • C#如何控制IIS動(dòng)態(tài)添加刪除網(wǎng)站詳解

    C#如何控制IIS動(dòng)態(tài)添加刪除網(wǎng)站詳解

    這篇文章主要給大家介紹了關(guān)于C#如何控制IIS動(dòng)態(tài)添加刪除網(wǎng)站的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C#延遲執(zhí)行方法函數(shù)實(shí)例講解

    C#延遲執(zhí)行方法函數(shù)實(shí)例講解

    這篇文章主要介紹了C#延遲執(zhí)行方法函數(shù)實(shí)例講解,這是比較常用的函數(shù),有需要的同學(xué)可以研究下
    2021-03-03
  • c#索引器詳解示例

    c#索引器詳解示例

    索引器是一種特殊的類成員,它能夠讓對(duì)象以類似數(shù)組的方式來(lái)存取,使程序看起來(lái)更為直觀,更容易編寫。
    2014-04-04

最新評(píng)論

若尔盖县| 彰化市| 盱眙县| 玛曲县| 灵台县| 务川| 新民市| 金坛市| 福清市| 桑植县| 荣昌县| 龙陵县| 康定县| 屏南县| 阿城市| 弥渡县| 鄱阳县| 韶山市| 石城县| 新平| 巴中市| 成武县| 鞍山市| 桃江县| 阿尔山市| 台山市| 昌图县| 沾益县| 天津市| 广元市| 札达县| 宁都县| 忻城县| 盈江县| 孙吴县| 滕州市| 徐闻县| 万源市| 深州市| 高淳县| 长泰县|