你们觉得MemberwiseClone方法是必要的吗

weikeli19 2016-06-13 10:33:54
我觉得MemberwiseClone是不必要的 ,何必一定要用MemberwiseClone方法呢?你们说呢打个比方我写一个程序你们看看:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace delete
{
public class Content
{
public int Val;
}
public class Cloner
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
}
class Program
{
static void Main(string[] args)
{
Cloner a = new Cloner(3);
Cloner b = a;//这里不一样也是浅度复制吗?何必一定要用MemberwiseClone方法呢
Console.WriteLine(b.MyContent.Val);
}
}
}
...全文
434 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxj1995 2018-12-25
  • 打赏
  • 举报
回复
用MemberwiseClone实现的浅拷贝,实例化对象的值类型实际上是相互独立,修改不会造成相互影响的 对实例化对象中的引用类型属性则会按照地址引用相互影响, 说实话我个人感觉这就像“茴香豆的茴有几种写法”,我既然都用了浅拷贝还需要管他那些数据按照值引用不是多此一举嘛。。。
Forty2 2016-06-13
  • 打赏
  • 举报
回复
引用 楼主 weikeli19 的回复:
... Cloner b = a;//这里不一样也是浅度复制吗?何必一定要用MemberwiseClone方法呢 ...
b = a;不是浅度复制,是引用拷贝。

namespace delete
{
    public class Content
    {
        public int Val;
    }
    public class Cloner
    {
        public Content MyContent = new Content();
        public Cloner(int newVal)
        {
            MyContent.Val = newVal;
        }
        public Cloner ShallowClone()
        {
            return (Cloner)this.MemberwiseClone();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Cloner a = new Cloner(3);
            Cloner b = a;//这里不是浅度复制。
            Cloner c = a.ShallowClone();

            // 区别1:
            bool eq1 = object.ReferenceEquals(a, b); // true, a和b指向同一个对象。
            bool eq2 = object.ReferenceEquals(a, c); // false, a和c是不同对象。

            // 区别2:
            b.MyContent = null;  // 由于a和b是同一个对象,改变b的内容,等于改变a的内容
            bool isnull1 = a.MyContent == null; // true
            bool isnull2 = c.MyContent == null; // false,c的MyContent还在
        }
    }
}
weikeli19 2016-06-13
  • 打赏
  • 举报
回复
引用 6 楼 weikeli19 的回复:
[quote=引用 3 楼 shingoscar 的回复:] 但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么
不是修改一次 就去b=a; 也不是100个字段,复制每个字段就要b=a; [/quote] 我给你看 就哪怕用了MemberwiseClone方法,改了一个另一个也会变化 我想了一下我估计你搞错了 你说的是深度复制 而我说的是浅度复制 你仔细看教科书:
weikeli19 2016-06-13
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么
不是修改一次 就去b=a; 也不是100个字段,复制每个字段就要b=a;
Poopaye 2016-06-13
  • 打赏
  • 举报
回复
引用 4 楼 weikeli19 的回复:
[quote=引用 3 楼 shingoscar 的回复:] 但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么
但是再多的字段 前提是只要有了 Cloner b = a; 后面对a对象的字段进行修改 b对象里的字段同样也会被改写,不会手抽筋的[/quote] 你这不叫复制啊,这叫赋值 复制的话,改了一个,另一个不会变化
weikeli19 2016-06-13
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么
但是再多的字段 前提是只要有了 Cloner b = a; 后面对a对象的字段进行修改 b对象里的字段同样也会被改写,不会手抽筋的
Poopaye 2016-06-13
  • 打赏
  • 举报
回复
但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么
  • 打赏
  • 举报
回复
“不必要用”,这是人家有分寸。作为后继者就是要体会、理解“何时用”更好! 而不是相反。
  • 打赏
  • 举报
回复
引用 楼主 weikeli19 的回复:
[color=#FF00FF]我觉得MemberwiseClone是不必要的 ,何必一定要用MemberwiseClone方法呢?
年轻人说话总是自相矛盾还自觉很屌。这里,“不必要”跟“一定要”是矛盾的吗? 你首先用了一个挑剔的逻辑、“挑事儿”的逻辑,然后引起争议。有不少的刚工作的小孩子在单位里不尊重传统、不重视真正的技术,喜欢无端去“挑战”,而一些管理者则喜欢利用这种幼稚来排挤老程序员。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧