zoukankan      html  css  js  c++  java
  • MemberwiseClone 关于 string 浅拷贝的一个误解

    1. static void Main(string[] args)  
    2. {  
    3.   
    4.     var cls1 = new MyClass { MyInt = 111, MyStr = "这是111", OtherClass = new MyClassOther { MyInt = 111111, MyStr = "这是111111" } };  
    5.   
    6.     //Clone后:  
    7.     //cls1.MyStr与cls2.MyStr都是指向了"这是111"的reference而不是instance  
    8.     //也可以这么理解:"这是111"是放在一个表里且有个ID;cls1与cls2是另一个表的两条记录,这两条记录的字段MyStr里存放的都是"这是111"的ID。  
    9.     //cls1.OtherClass与cls2.OtherClass同理是指向了相关对象的reference而不是instance  
    10.     var cls2 = cls1.Clone() as MyClass;  
    11.   
    12.   
    13.     //此操作对cls1.MyStr没有任何影响,只是将cls2.MyStr的reference变为了"这是222"的reference  
    14.     //所以改动后:cls1.MyStr != cls2.MyStr  
    15.     cls2.MyStr = "这是222";  
    16.   
    17.     //此操作跟上面有些不一样,因为cls2.OtherClass与cls1.OtherClass都是指向同一个reference,此reference没有变,对reference的instance任何改动,  
    18.     //所以改动后,cls1.OtherClass.MyStr == cls2.OtherClass.MyStr   cls1.OtherClass.MyInt == cls2.OtherClass.MyInt  
    19.     cls2.OtherClass.MyStr = "这是444444";  
    20.     cls2.OtherClass.MyInt =444444;  
    21.   
    22. }  
    23.   
    24. class MyClass : ICloneable  
    25. {  
    26.     public int MyInt { get; set; }  
    27.     public string MyStr { get; set; }  
    28.     public object Clone()  
    29.     {  
    30.         return this.MemberwiseClone();  
    31.     }  
    32.     public MyClassOther OtherClass { get; set; }  
    33. }  
    34.   
    35. class MyClassOther  
    36. {  
    37.     public int MyInt { get; set; }  
    38.     public string MyStr { get; set; }  
    39. }  

  • 相关阅读:
    [Effective C++, 学习总结] 01 视C++为一个语言联邦
    【原创】从“心”开始
    [C++, Basic, 02] 控制对象初始化与析构的顺序
    电信PPPoE拨号失败,获取不到IP
    IPV6学习笔记
    win10提示目前无法访问SmartScreen
    IBM服务器进入IMM
    python把文字转成语音
    python爬虫获取贴吧图片
    ibm x3550更换主板后无法加载系统引导
  • 原文地址:https://www.cnblogs.com/shihao/p/2617173.html
Copyright © 2011-2022 走看看