不可改变对象的定义

  一个类型的对象在创建后,它的状态就不能再改变,知道它死亡,它的状态一直维持与创建时相同。这时候称该对象具有不可改变性。这样的类型为不可改变类型。
不可改变对象在创建的时候,必须完全初始化。因为创建完成后就不能再改变了。任何对不可改变对象进行的操作都会生成一个新的对象。例如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------定义不可改变类型的更多相关文章

  1. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  2. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  3. ANTLR3完全参考指南读书笔记[06]

    前言 这段时间在公司忙的跟狗似的,但忙的是没多少技术含量的活儿. 终于将AST IR和tree grammar过了一遍,计划明天写完这部分的读书笔记.   内容 1 内部表示AST构建 2 树文法   ...

  4. Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据

    不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...

  5. JS权威指南读书笔记(七)

    第十七章 事件处理 1 客户端JS程序采用了异步事件驱动编程模型. 2 关于事件的重要定义     a 事件类型(event type)     b 事件目标(event target) target ...

  6. css权威指南读书笔记

    今天翻手机,翻到了许久之前看css权威指南时的笔记,遂移到博客中来. 1.属性选择器p.one class名为one的p元素p[class][name] 含有class和name属性的p元素p[cla ...

  7. ANTLR3完全参考指南读书笔记[05]

    前言 仅生成给出true/false的识别器是没有多大用处的,自然的就有在识别过程中遇到某一结构时执行一段代码.存储该结构中信息的想法. ANTLR提供了在文法中嵌入属性和动作超级混合“文法”,可以生 ...

  8. ANTLR3完全参考指南读书笔记[02]

    前言 程序语言是什么? 用wiki上的描述,程序语言是一种人工设计的语言,用于通过指令与机器交互:程序语言是编程程序的标记,而程序是一种计算或算法的描述.详细介绍和背景信息参考: Programmin ...

  9. ANTLR3完全参考指南读书笔记[01]

    引用 Terence Parr. The Definitive ANTLR Reference, Building Domain Specific Languages(antlr3 version). ...

随机推荐

  1. 你需要知道的这几种 asp.net core 修改默认端口的方式

    一般情况下,aspnetcore发布后的默认端口是5000,这个大家都知道,而且默认骨架代码中没有看到任何让你输入的ip地址和端口号,但作为程序员的我们,不希望 被框架所管制,那如何实现默认端口的修改 ...

  2. 递归一个List<T>,可自己根据需要改造为通用型。

    /// <summary> /// 递归一个List<ProvinceOrg> /// </summary> /// <returns></ret ...

  3. 程序员如何巧用Excel提高工作效率

    作为一名程序员,我们可能很少使用Excel,但是公司的一些职能部门,比如HR,财务等,使用Excel真的是太熟练了,以至于一些系统开发出来,导入和导出功能是使用最频繁的,哈哈. 其实在程序开发的过程中 ...

  4. SAP MM 巴西采购订单中的NCM Code

    SAP MM 巴西采购订单中的NCM Code 1,近日收到业务部门报的一个问题,某用户试图将采购订单4400000071中ITEM 40的删除标记取消, SAP系统报错,'Enter a valid ...

  5. 基于Nginx进行地图瓦片缓存的方案描述

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 在产品的迭代中,我们完成了移动端瓦片缓存方案和服务端瓦片缓存 ...

  6. 【原】无脑操作:TypeScript环境搭建

    概述:本文描述TypeScript环境搭建,以及基于VSCode的自动编译设置和调试设置.网络上很多相应文章的方式过时了或者无法试验成功. ------------------------------ ...

  7. 4. [mmc subsystem] mmc core(第四章)——host模块说明

    零.说明 对应代码drivers/mmc/core/host.c,drivers/mmc/core/host.h. 为底层host controller driver实现mmc host的申请以及注册 ...

  8. 使用Chrome 中的 ssh 插件登陆 linux 服务器

    . 在chrome 商店中搜索 secure shell , 安装 Secure Shell Extension 2. 安装完成后,就可以在应用程式中找到Secure Shell App 3.点击 S ...

  9. 判断HTML中的checkbox是否被选中

    //合法性验证 function checkValidity() { var userNameCheck = $("#userNameCheck").attr('checked') ...

  10. Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...