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

时间:2022-05-18 17:07:07
我觉得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);
        }
    }
}

8 个解决方案

#1


引用 楼主 weikeli19 的回复:
[color=#FF00FF]我觉得MemberwiseClone是不必要的 ,何必一定要用MemberwiseClone方法呢?


年轻人说话总是自相矛盾还自觉很屌。这里,“不必要”跟“一定要”是矛盾的吗?

你首先用了一个挑剔的逻辑、“挑事儿”的逻辑,然后引起争议。有不少的刚工作的小孩子在单位里不尊重传统、不重视真正的技术,喜欢无端去“挑战”,而一些管理者则喜欢利用这种幼稚来排挤老程序员。

#2


“不必要用”,这是人家有分寸。作为后继者就是要体会、理解“何时用”更好!

而不是相反。

#3


你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

#4


引用 3 楼 shingoscar 的回复:
你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

但是再多的字段  前提是只要有了 Cloner b = a;  后面对a对象的字段进行修改  b对象里的字段同样也会被改写,不会手抽筋的

#5


引用 4 楼 weikeli19 的回复:
Quote: 引用 3 楼 shingoscar 的回复:

你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

但是再多的字段  前提是只要有了 Cloner b = a;  后面对a对象的字段进行修改  b对象里的字段同样也会被改写,不会手抽筋的

你这不叫复制啊,这叫赋值
复制的话,改了一个,另一个不会变化

#6


引用 3 楼 shingoscar 的回复:
你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

不是修改一次 就去b=a;  也不是100个字段,复制每个字段就要b=a;  

#7


引用 6 楼 weikeli19 的回复:
Quote: 引用 3 楼 shingoscar 的回复:

你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

不是修改一次 就去b=a;  也不是100个字段,复制每个字段就要b=a;  

我给你看  就哪怕用了MemberwiseClone方法,改了一个另一个也会变化  我想了一下我估计你搞错了 你说的是深度复制 而我说的是浅度复制 你仔细看教科书: 你们觉得MemberwiseClone方法是必要的吗

#8


引用 楼主 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还在
        }
    }
}

#1


引用 楼主 weikeli19 的回复:
[color=#FF00FF]我觉得MemberwiseClone是不必要的 ,何必一定要用MemberwiseClone方法呢?


年轻人说话总是自相矛盾还自觉很屌。这里,“不必要”跟“一定要”是矛盾的吗?

你首先用了一个挑剔的逻辑、“挑事儿”的逻辑,然后引起争议。有不少的刚工作的小孩子在单位里不尊重传统、不重视真正的技术,喜欢无端去“挑战”,而一些管理者则喜欢利用这种幼稚来排挤老程序员。

#2


“不必要用”,这是人家有分寸。作为后继者就是要体会、理解“何时用”更好!

而不是相反。

#3


你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

#4


引用 3 楼 shingoscar 的回复:
你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

但是再多的字段  前提是只要有了 Cloner b = a;  后面对a对象的字段进行修改  b对象里的字段同样也会被改写,不会手抽筋的

#5


引用 4 楼 weikeli19 的回复:
Quote: 引用 3 楼 shingoscar 的回复:

你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

但是再多的字段  前提是只要有了 Cloner b = a;  后面对a对象的字段进行修改  b对象里的字段同样也会被改写,不会手抽筋的

你这不叫复制啊,这叫赋值
复制的话,改了一个,另一个不会变化

#6


引用 3 楼 shingoscar 的回复:
你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

不是修改一次 就去b=a;  也不是100个字段,复制每个字段就要b=a;  

#7


引用 6 楼 weikeli19 的回复:
Quote: 引用 3 楼 shingoscar 的回复:

你们觉得MemberwiseClone方法是必要的吗但是你有没有想过,如果一个类不是1个字段,而是100个呢?不是要写到手抽筋了么

不是修改一次 就去b=a;  也不是100个字段,复制每个字段就要b=a;  

我给你看  就哪怕用了MemberwiseClone方法,改了一个另一个也会变化  我想了一下我估计你搞错了 你说的是深度复制 而我说的是浅度复制 你仔细看教科书: 你们觉得MemberwiseClone方法是必要的吗

#8


引用 楼主 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还在
        }
    }
}