当前位置:编程学习 > ASP.NET> 正文

.Net中Immutable(不可变)集合

时间:2015-9-6类别:编程学习

.Net中Immutable(不可变)集合

.Net中Immutable(不可变)集合

一、immutable对象的优点

1、对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象

2、线程安全的:immutable对象在多线程下安全,没有竞态条件

3、不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)

4、可以被使用为一个常量,并且期望在未来也是保持不变的

 

二、.Net中如何添加immutable程序集

MS在Nuget上发布了一个Immutable Collection的程序集,提供了对不可变对象的集合的支持。

再搜索Immutable,添加即可。

 

三、Immutable集合包括了下面的不可变集合:

 

System.Collections.Immutable.ImmutableArray

System.Collections.Immutable.ImmutableArray<T>

System.Collections.Immutable.ImmutableDictionary

System.Collections.Immutable.ImmutableDictionary<TKey,TValue>

System.Collections.Immutable.ImmutableHashSet

System.Collections.Immutable.ImmutableHashSet<T>

System.Collections.Immutable.ImmutableList

System.Collections.Immutable.ImmutableList<T>

System.Collections.Immutable.ImmutableQueue

System.Collections.Immutable.ImmutableQueue<T>

System.Collections.Immutable.ImmutableSortedDictionary

System.Collections.Immutable.ImmutableSortedDictionary<TKey,TValue>

System.Collections.Immutable.ImmutableSortedSet

System.Collections.Immutable.ImmutableSortedSet<T>

System.Collections.Immutable.ImmutableStack

System.Collections.Immutable.ImmutableStack<T>

 

四、Immutable常见的使用场景

Immutable由于具有不可变性,具有线程安全特性,因此比较适宜于多线程场景。

 

例如,在遍历的时候,为了防止遍历期间集合被破坏,传统的做法如下

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

如果遍历的时间较长,会长期锁定集合,导致其它的调用处饿死,并且还需要避免死锁。

使用Immutable集合线程安全,可以不用加锁直接遍历,不仅性能更加优异,代码也更加优雅,能帮助我们快速实现稳定高效的程序。

 

五、Immutable Builders

由于Immutable对象的更改操作是生成你一个新的对象,因此当频繁更改时,开销是比较大的。因此,和传统的Immutable对象string有一个StringBuild一样,对于Immutable集合,也提供了相应的Immutable Builder对象来进行批量更新操作。

为了方便使用,还提供了两个扩展函数ToBuilder()和ToImmutable()在Immutable Builder和Immutable集合间快速互相转换。

例如

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

 

标签:
上一篇下一篇

猜您喜欢

热门推荐