《.NET 进阶指南》读书笔记2------定义不可改变类型
不可改变对象的定义
一个类型的对象在创建后,它的状态就不能再改变,知道它死亡,它的状态一直维持与创建时相同。这时候称该对象具有不可改变性。这样的类型为不可改变类型。
不可改变对象在创建的时候,必须完全初始化。因为创建完成后就不能再改变了。任何对不可改变对象进行的操作都会生成一个新的对象。例如String类型就是一个不可改变类型。任何对String类型实例的改变,如String.Trim()、String.Replace()都不会影响原有的String对象,这些方法都会生成一个全新的String对象。
如何定义一个不可变类型
定义一个不可改变类型时,需要注意以下三点:
- 类型的构造方法一定要设计好,能够充分的初始化对象,因为对象创建好后,就无法再进行改变,构造方法是唯一能够改变对象状态的地方;
- 涉及改变对象状态的方法均不能真正的改变对象的本身,而都应该返回一个全新的对象;
- 类型的所有的公开属性都应该是只读的,并且注意一些引用类型虽然是只读的,但是可以通过只读的引用去更改堆中的实例从而更改了原对象的状态
class ImmutableType
{
private int _val;
private int[] _refs;
public int Val
{
get
{
return _val;
}
}
// 对于引用类型,返回一个新的对象,防止被改变
public int[] Refs
{
get
{
int b = new int[_refs.Length];
for(int i = 0; i < b.Length;i++)
{
b[i] = _refs[i];
}
return b;
}
}
//构造函数
public ImmutableType(int val,int[] refs)
{
_val = val;
_refs = new int[refs.Length];
for(int i = 0; i < _refs.Length;i++)
{
_refs[i] = refs[i];
}
}
// 对属性进行更新时返回了一个新的对象
public ImmutableType UpdateVal(int val)
{
return new ImmutableType(this._val + val,this._refs);
}
}
class Program
{
static void Main()
{
ImmutableType a = new ImmutableType(1,new int[]{1,2,3,4});
a = a.UpdateVal(2);// 这里返回了一个新的对象
}
}
《.NET 进阶指南》读书笔记2------定义不可改变类型的更多相关文章
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- HTTP权威指南读书笔记
HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...
- ANTLR3完全参考指南读书笔记[06]
前言 这段时间在公司忙的跟狗似的,但忙的是没多少技术含量的活儿. 终于将AST IR和tree grammar过了一遍,计划明天写完这部分的读书笔记. 内容 1 内部表示AST构建 2 树文法 ...
- Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据
不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...
- JS权威指南读书笔记(七)
第十七章 事件处理 1 客户端JS程序采用了异步事件驱动编程模型. 2 关于事件的重要定义 a 事件类型(event type) b 事件目标(event target) target ...
- css权威指南读书笔记
今天翻手机,翻到了许久之前看css权威指南时的笔记,遂移到博客中来. 1.属性选择器p.one class名为one的p元素p[class][name] 含有class和name属性的p元素p[cla ...
- ANTLR3完全参考指南读书笔记[05]
前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...
- ANTLR3完全参考指南读书笔记[02]
前言 程序语言是什么? 用wiki上的描述,程序语言是一种人工设计的语言,用于通过指令与机器交互:程序语言是编程程序的标记,而程序是一种计算或算法的描述.详细介绍和背景信息参考: Programmin ...
- ANTLR3完全参考指南读书笔记[01]
引用 Terence Parr. The Definitive ANTLR Reference, Building Domain Specific Languages(antlr3 version). ...
随机推荐
- java游戏开发杂谈 - 游戏编程浅析
每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...
- 我的秋招经验分享(已拿BAT头条网易滴滴)
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Linux-误删apt-get以及把aptitude换回
误删apt-get拯救我的linux 一.前言 先来说一下apt-get, 这个我们使用linux过程中最常用的命令之一. apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于 ...
- Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
前言 在 Asp.Net Core 中,我们常常使用 System.Threading.Timer 这个定时器去做一些需要长期在后台运行的任务,但是这个定时器在某些场合却不太灵光,而且常常无法 ...
- 第四节 pandas 数据加载
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和read_table这两个使用最多. #导包import pandas as pd from panda ...
- TCP的三次握手与四次挥手
TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...
- 如何给自己的app添加分享到有道云笔记这样的功能
文章同步自http://javaexception.com/archives/34 如何给自己的app添加分享到有道云笔记这样的功能 问题: 在之前的一个开源笔记类项目Leanote中,有个用户反馈想 ...
- 一张图看懂 SQL 的各种 join 用法
下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 具体分解如下: 1.INNER JOIN(内连接) 2.LEFT J ...
- 20190415 - iOS11 无法连接到 App Store 的解决办法
问题:更新 iOS 11 后,打开 App Store 提示: 无法连接至 app store 解决: 进入 iOS 系统[设置][iTunes Store 与 App Store],退出当前登录用户 ...
- rabbitmq消费者“无故消失”
hi,all 导读:9月1号17:12左右,发现影子队列存在大量“unacked”(收到了消息,但是还没有手动确认消息)的消息,一段时间后“unacked”的数量没有减少,但是观察消费者端的日志, ...