.Net中Immutable(不可变)集合
.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();
- ASP.NET中TimeSpan的用法
- asp.net后台输出js脚本
- asp.net中Server.MapPath的使用
- 2013-12-25
- asp.net文件下载的方法
- asp.net将Excel文档转换成pdf
- ASP.NET中使用CodeDomProvider调用js文件中的js方法
- asp.net 文件操作
- ASP.NET给图片加文字水印
- ASP.NET将WORD、PDF、PPT转为图片
- ASP.NET mvc异常处理的方法
- asp.net去除字符串中html标签
- ASP.NET URL路径问题
- ASP.NET生成二维码
- ASP.NET中重载(Overload)和覆写(Override)
- ASP.NET匿名类型var
- 泪目 这位 刷屏 的英雄,是全椒人的骄傲(泪目这位刷屏)
- 人从众 火炎焱 全椒再现 正月十六走太平 的魅力(人从众火炎焱全椒再现)
- 官宣 全椒籍明星许海峰 奚秀兰 方芳 王璐瑶携手回家 走太平(全椒籍明星许海峰)
- 以前全椒人是怎么过冬的 满满都是回忆(以前全椒人是怎么过冬的)
- NVIDIA显卡份额冲上88 A饭发愁 游戏优化恐没A卡份了(NVIDIA显卡份额冲上88A饭发愁)
- AMD YES A卡还是N卡 A卡和N卡的区别(AMDYESA卡还是N卡)
热门推荐
- vue3 兄弟组件(vue3如何按需加载第三方组件库详解)
- div css实例列表(DIV+CSS实现电台列表设计的示例代码)
- dedecms使用方法(Dedecms织梦CMS搜索页面调用全站最新文章的方法)
- vuejs组件使用教程交流(Vue vee-validate插件的简单使用)
- layui导航栏(使用layui实现左侧菜单栏及动态操作tab项的方法)
- djangorestfulframework教程(Django restframework 源码分析之认证详解)
- php中怎么分割数组(PHP实现数组根据某个字段进行水平合并,横向合并案例分析)
- dedecms提示怎么去除(DEDECMS网站被挂马的解决办法)
- react的基本知识(React中refs的一些常见用法汇总)
- 织梦dedecms自定义表单选项必填修改解决方法(织梦dedecms自定义表单选项必填修改解决方法)