.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中异常处理的注意事项
- ASP.NET Web API是什么
- ASP.NET中lock 的用法
- ASP.NET常见面试题
- ASP.NET生成二维码
- docker 部署netcore(关于Jenkins + Docker + ASP.NET Core自动化部署的问题避免踩坑)
- ASP.NET中Web API的简单实例
- ASP.NET 生成条形码
- ASP.NET方法重载
- asp.net小数点四舍五入
- asp.net操作cookie
- Asp.Net实现网站的快捷方式
- 发送邮件的asp.net代码
- php 与asp对比(asp.net和php的区别点总结)
- ASP.NET List 集合操作
- ASP.NET将WORD、PDF、PPT转为图片
- 买绿宝不能只挑黄绿色 菜农教你3招挑,个个皮薄肉脆,香甜爆汁(买绿宝不能只挑黄绿色)
- 大果肉搭配薄瓜皮, 绿宝 脆甜爽口,不愧是甜瓜中的 佼佼者(大果肉搭配薄瓜皮)
- 河南尉氏县因地制宜发展果蔬种植 水坡镇绿宝甜瓜变 金瓜(河南尉氏县因地制宜发展果蔬种植)
- 谢广坤,你这么欺负谢腾飞,良心不会痛吗(你这么欺负谢腾飞)
- 乡村爱情15 宋晓峰怀疑自己孩子,腾飞与姜奶奶亲子鉴定出结果(宋晓峰怀疑自己孩子)
- 《乡村爱情13》开播,新版刘能以假乱真,编剧思维进入瓶颈(新版刘能以假乱真)
热门推荐
- python中list怎么用(详解python中list的使用)
- python多线程多种方法(详解python多线程之间的同步一)
- 阿里云注册域名ddns怎么写(如何通过阿里云实现动态域名解析DDNS的方法)
- vuex-table行列转换效果(vue3+el-table实现行列转换)
- html+css网页布局实例(网页布局入门教程 如何用CSS进行网页布局)
- css图片3D效果(用CSS实现图片的3D凹凸感凸出镜框外或凹陷镜框里)
- vue创建项目同时引入elementui(Vue Element前端应用开发之开发环境的准备工作)
- visual studio中快速定位打开的文件所处的树形路径
- thinkphp实战教程之博客技术学习(python3编写ThinkPHP命令执行Getshell的方法)
- html元素和属性的区别(HTML5 HTMLCollection和NodeList的区别详解)