• 《.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);// 这里返回了一个新的对象  
     }
    }
    
  • 相关阅读:
    付费客户端攻防篇
    psql查询结果保存文件
    mysql5.5自定义函数-计算并赋值
    TortoiseSVN 提交时出现错误 Error: Malformed svndiff data in representation
    打开文件共享突然提示:你没有权限访问\。请与网络管理员联系请求访问权限。
    golang 实现笛卡尔积
    爬虫练习3:提取全国省市县信息并统计
    爬虫练习2:爬取省市信息(增加地址信息)
    爬虫练习1:爬取省市信息
    个人使用的效率神器分享【不定期补充】
  • 原文地址:https://www.cnblogs.com/MaFeng0213/p/9925604.html
Copyright © 2020-2023  润新知