c#不可变类型
c# 类型 不可
2023-06-13 09:15:42 时间
一、概要
不可变(immutable), 即对象一旦被创建,值就不能被改变,每次改变都会产生一个新对象。
不可变对象如下:
- string
- ImmutableStack
- ImmutableQueue
- ImmutableList
- ImmutableHashSet
- ImmutableSortedSet
- ImmutableDictionary
- ImmutableSortedDictionary
不可变对象的优点:
- 集合共享安全,从不被改变
- 访问集合时,不需要锁集合(线程安全)
- 修改集合不担心旧集合被改变
- 保证数据完整性,安全性
不可变对象的缺点:
- 当每次对象/集合操作都会返回新值。而旧值会保留一段时间,会使内存有极大开销,还会给GC造成回收负担,性能也比可变集合差(大约相差近40倍)。
二、详细内容
(1)string
由于string的不可变特性,
- 所以不建议保存敏感信息例如登录密码存储在内存中,就算会加密置空,但这都是新值。而旧值会长时间存储在共享域内存中,能拿到dump文件就可以看到旧值。建议使用SecureString来进行安全存储,使用时进行恢复及清理。
- 字符串不可变还意味着操作或方案字符串时不会发生线程同步问题,此外CLR可通过一个stirng对象共享多个完全一致的string内容。这样能减少系统中的字符串数量从而节省内存(称为字符串留用)。
(2)不可变集合
这里主要讲的是应用,不可变集合主要应用场景例如,类似迅雷的下载任务、撤销操作用来记录操作的集合等。这类场景通常不会对其中某一个元素内容进行编辑而且操作元素的频率并不频繁,同时还满足多线程安全避免加锁操作影响程序性能。
相关文章
- 站在前人的肩膀上重新透视C# Span<T>数据结构
- 【地铁上的Redis与C#】数据类型(七)--List类型
- 【地铁上的Redis与C#】数据类型(八)--List类型操作注意事项与常见业务场景
- 【地铁上的Redis与C#】数据类型(八)--set类型基本操作
- 【愚公系列】2023年01月 .NET/C#知识点-文件上传与下载
- 【地铁上的Redis与C#】数据类型(九)--set类型数据扩展操作(一)
- C# 可空值类型详解编程语言
- C#/.NET引用类型的内存分配
- C#/.NET值类型
- 扫描局域网IP地址和主机名的C#控制台代码
- c#数据库的sql参数封装类的编写
- C#Winform调用系统接口操作INI配置文件的代码
- C#一个WCF简单实例
- c#引用类型和值类型
- c#备忘录模式
- c#:CTS类型系统
- C#之IP地址和整数互转的小例子
- 带着问题读CLRviaC#(笔记二)类型基础
- C#随机生成Unicode类型字符串
- C#词法分析器之构造NFA详解
- 解析c#在未出现异常情况下查看当前调用堆栈的解决方法
- 深入Unix时间戳与C#DateTime时间类型互换的详解
- C#char类型字符转换大小写的实现代码
- C#无边框窗体之窗体移动实现代码
- C#保存上传来的图片示例代码
- C#中的多态深入理解
- c#使用反射调用类型成员示例
- c#利用system.net发送html格式邮件
- C#传递参数到线程的方法汇总
- C#简单多线程同步和优先权用法实例