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

.Net中的不可變集合(Immutable Collection)程序集簡介

 更新時間:2022年06月20日 10:30:11   作者:天方  
這篇文章介紹了.Net中的不可變集合(Immutable Collection)程序集,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天發(fā)現(xiàn)MS在Nuget上發(fā)布了一個Immutable Collection的程序集,提供了對不可變對象的集合的支持。

簡單的看了一下,貌似支持的還比較全:

  • ImmutableArray<T>

  • ImmutableStack<T>

  • ImmutableQueue<T>

  • ImmutableList<T>

  • ImmutableHashSet<T>

  • ImmutableSortedSet<T>

  • ImmutableDictionary<K, V>

  • ImmutableSortedDictionary<K, V>

使用方式比較簡單,一個簡單的示例如下(對對Immutable特性不熟悉的朋友請注意輸出結(jié)果和List的區(qū)別):

    var color1 = ImmutableArray.Create("orange", "red", "blue");
    var color2 = color1.Add("black");

    Console.WriteLine(">>> color1: " + color1);
    Console.WriteLine(">>> color2: " + color2);

Immutable Builders

由于Immutable對象的更改操作是生成你一個新的對象,因此當(dāng)頻繁更改時,開銷是比較大的。因此,和傳統(tǒng)的Immutable對象string有一個StringBuild一樣,對于Immutable集合,也提供了相應(yīng)的Immutable Builder對象來進(jìn)行批量更新操作。

為了方便使用,還提供了兩個擴(kuò)展函數(shù)ToBuilder()和ToImmutable()在Immutable Builder和Immutable集合間快速互相轉(zhuǎn)換。

    var color2Builder = color1.ToBuilder();
    color2Builder.Add("black");
    color2Builder.Add("white");
    var color2 = color2Builder.ToImmutable();

性能

下表是MS給出的基本集合操作的性能,還是令人滿意的。具體的數(shù)據(jù)結(jié)構(gòu)暫時沒有時間去研究它,感覺大部分應(yīng)該都是樹。

  

Mutable (amortized)

Mutable (worst case)

Immutable

Stack.Push

O(1)

O(n)

O(1)

Queue.Enqueue

O(1)

O(n)

O(1)

List.Add

O(1)

O(n)

O(log n)

HashSet.Add

O(1)

O(n)

O(log n)

SortedSet.Add

O(log n)

O(n)

O(log n)

Dictionary.Add

O(1)

O(n)

O(log n)

SortedDictionary.Add

O(log n)

O(n log n)

O(log n)

不過,由于每次對集合操作都會生成新的副本(并不會拷貝集合成員),應(yīng)該是有額外的內(nèi)存開銷的,從它的性能上來看,應(yīng)該是一種空間換時間的做法,有空再研究一下。

使用場景

Immutable由于具有不可變性,天生是線程安全的,因此非常適宜于多線程場景。例如,在遍歷的時候,為了防止遍歷期間集合被破壞,傳統(tǒng)的做法有如下兩種

1. 鎖定法:

    lock (list)
    {
        foreach (var item in list)
        {
            //do something
        }
    }

如果遍歷的時間較長,會長期鎖定集合,導(dǎo)致其它的調(diào)用處餓死。為了解決這種情況,又有下一種做法。

2. 副本法

    lock (list)
    {
        var listCopy = list.ToArray();    
    }

    foreach (var item in listCopy)
    {
        //do something
    }

這種方式的最大問題是每次遍歷都要生成副本,如果遍歷比較頻繁則開銷較大。PS:這種場景下仍然需要lock(生成副本的時候)。

另外,這兩種地方都需要對對象加鎖,加鎖除了影響性能外,還需要在每一個使用的地方都加鎖,并且還需要避免死鎖。這個基本上和內(nèi)存泄漏一樣對程序員來說是是一個非常大的負(fù)擔(dān)

而Immutable集合天生線程安全,可以不用加鎖直接遍歷,不僅性能更加優(yōu)異,代碼也更加優(yōu)雅,能幫助我們快速實(shí)現(xiàn)穩(wěn)定高效的程序。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET中Image控件使用詳解

    ASP.NET中Image控件使用詳解

    本文詳細(xì)介紹了Image控件的使用方法,用實(shí)例演示了Image控件的用法,希望對大家有所幫助。
    2016-04-04
  • ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    本文主要介紹ObjectDataSource控件和DataObjectTypeName屬性的用法,希望能給小伙伴們一些幫助。
    2016-04-04
  • Json.Net6.0用法介紹

    Json.Net6.0用法介紹

    這篇文章介紹了Json.Net6.0的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • 常用C#關(guān)鍵字詳解教程(比較全面)

    常用C#關(guān)鍵字詳解教程(比較全面)

    學(xué)習(xí)C#很久了,但可能你也和我一樣,總有那么一兩個關(guān)鍵詞,說不清楚它是什么意思,有什么用,那么這篇文章就帶你一一講解。
    2016-04-04
  • .net?6精簡版webapi教程及熱重載、代碼自動反編譯演示

    .net?6精簡版webapi教程及熱重載、代碼自動反編譯演示

    這篇文章介紹了.net?6精簡版webapi教程及熱重載、代碼自動反編譯演示,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • SQL Server 2005安裝過程中出現(xiàn)錯誤的解決辦法

    SQL Server 2005安裝過程中出現(xiàn)錯誤的解決辦法

    SQL Server 2005安裝過程中出現(xiàn)錯誤的解決辦法...
    2007-02-02
  • WPF布局及布局容器介紹

    WPF布局及布局容器介紹

    這篇文章介紹了WPF布局及布局容器,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 為ABP框架添加基礎(chǔ)集成服務(wù)

    為ABP框架添加基礎(chǔ)集成服務(wù)

    這篇文章介紹了為ABP框架添加基礎(chǔ)集成服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • WPF使用ValidationRules對MVVM架構(gòu)數(shù)據(jù)驗證

    WPF使用ValidationRules對MVVM架構(gòu)數(shù)據(jù)驗證

    這篇文章介紹了WPF使用ValidationRules對MVVM架構(gòu)數(shù)據(jù)驗證的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • ADO.NET基礎(chǔ)知識詳解

    ADO.NET基礎(chǔ)知識詳解

    本文詳細(xì)講解了ADO.NET基礎(chǔ)知識,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論

自治县| 郎溪县| 齐齐哈尔市| 晋中市| 上栗县| 离岛区| 二连浩特市| 永寿县| 马鞍山市| 辉县市| 蒙山县| 江达县| 沿河| 离岛区| 英超| 金昌市| 运城市| 锦州市| 独山县| 隆林| 平昌县| 普宁市| 读书| 东源县| 巴楚县| 清流县| 吉林省| 湘潭县| 夹江县| 库伦旗| 溆浦县| 大同市| 沈阳市| 沧州市| 蕲春县| 梁平县| 栖霞市| 特克斯县| 武夷山市| 麟游县| 甘德县|