C#深拷贝的问题……

时间:2021-05-20 19:53:30
我是新手一名,有个比较白痴的C#问题请教一下各位大神, 对类进行深拷贝的时候 是继承ICloneable接口 还是直接自己写个深拷贝的方法啊?各位编程的时候比较喜欢用哪种(集成接口并实现,或是自己写个方法)? C#深拷贝的问题…………
C#为啥把复制构造器弄没了……………… C#深拷贝的问题……

12 个解决方案

#1


继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。

#2


继承接口并实现,这就是要写n行代码。自己写实现方法,这还是要写这n行代码。

如果你不知道为什么要继承接口,你就不需要它。不需要为了“接口”这个概念比较时髦而使用它。

从你的描述中看出,你完全不知道自己为什么要使用接口。仅此而已。

#3


引用 1 楼 sp1234 的回复:
继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。


首先感谢您热心的回复!其次,如果两者有明显的代码量的区别 我也就不会纠结了,就是因为这两个工作了很相似,所以我才纠结,我想知道一个资深程序员的习惯是怎么做的。是去继承一个接口,还是自己去弄一个方法。就好似接口都是用I开头的一样,这种约定俗成的东西,不会有哪本书会告诉我。所以我才要问。希望能够耐心的给我解答一下!再次感谢!

#4


继承ICloneable接口也是要自己实现拷贝的  你的问题是为什么要继承ICloneable接口  自己写一个不是也可以是实现么   继承ICloneable接口或者IDisposable之类的是一些常用的接口  接口就是规范  假如组里有人要用你的类  如果你自己实现还要告诉人家你这个类里哪个方法是干什么用的  多麻烦   就像你说的 这些常用接口是约定俗成的东西  大家都知道,这样人家马上就知道你这个方法是干什么用的了  不用跑来跑去问来问去了
偶是这么理解的...

#5


我好像突然想明白了。如果 在某个类中,需要调用很多不同的类的 深拷贝功能,就可以继承这个借口,然后通过接口去访问方法,来减少重载的次数,反之,如果只是这个类自己用,而不需要通过接口去调用这个方法,就可以自己写一个 深拷贝的方法了 我说的对么?
举个例子:
class Class1:ICloneable
{
    public object Clone(){................}
}
class Class2:ICloneable
{
    public object Clone(){................}
}
class Class3:ICloneable
{
    public object Clone(){................}
}



class Class//用于调用前边类中的复制功能
{
     public void CloneClass(ICloneable iClone1,ICloneable iClone2)//省去多次重载的麻烦
     {
      iClone2=iClone1.Clone();
      }
}

菜鸟一只。。。例子不贴切 希望有人能看得懂吧

#6


引用 4 楼 chopper7278 的回复:
继承ICloneable接口也是要自己实现拷贝的  你的问题是为什么要继承ICloneable接口  自己写一个不是也可以是实现么   继承ICloneable接口或者IDisposable之类的是一些常用的接口  接口就是规范  假如组里有人要用你的类  如果你自己实现还要告诉人家你这个类里哪个方法是干什么用的  多麻烦   就像你说的 这些常用接口是约定俗成的东西  ……


恩恩 对,这个也是,这样就能统一大家的类中拥有的功能了!

#7


哦,对了 5L的帖子忘了对Clone方法返回的Object进行类型转换了……

#8


恩,说的楼主有些模糊了。我解释下,接口相当于电源插座,他只是个预留的东西,你可以在上边插冰箱、插电脑,它只是把你的用电器囊括到你的家用电器这个行列中,比如说你家没有保存食物的功能,当你插了个冰箱,你家整体就多了个保存食物的功能了。
这个和类继承有区别,接口是程序实现你插上东西的途径,插上的东西是由你决定了,所以楼上说,是否继承接口,写的东西都差不多。

#9


LZ纠结

引用 3 楼 qq446569365 的回复:
引用 1 楼 sp1234 的回复:继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。
……

接口只是定义一个规范,个人的实现可能都是不一样的。微软只是吧这个规范提供出来,继承接口去实现,或自定义一个类我觉得都可以。但继承接口就要实现接口里面的所以方法,所以这里自己取舍

#10


感谢各位的回答~~我已经知道该怎么做了~谢谢 C#深拷贝的问题……

#11


接口是要自己实现的

        public class Obj : ICloneable
        {
            public Obj() { }
            private Obj(Obj obj) { this.FuckU2 = obj.FuckU2; }
            public bool FuckU2 { get; set; }
            public object Clone()
            {
                return new Obj(this);
            }
        }

#12


关于LZ问的为啥一定要实现接口,而不是自己添加个Clone方法,楼上只是说了很表层的一部分。

.NET之所以提供IDisposable以及IClonable这种看似没什么营养的接口,是有实际用处的,不仅仅是让你看着规范。

其关键用处在于利用OOP的多态特性,实现统一相关操作,以提高互操作性。这是因为.NET Framework很大一部分内容是这个类库,其中一些就Dispose以及Clone相关。比如,using语句(不是名字空间那个)作为C#语法的一部分,要求参数必须是IDisposable类型。

#1


继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。

#2


继承接口并实现,这就是要写n行代码。自己写实现方法,这还是要写这n行代码。

如果你不知道为什么要继承接口,你就不需要它。不需要为了“接口”这个概念比较时髦而使用它。

从你的描述中看出,你完全不知道自己为什么要使用接口。仅此而已。

#3


引用 1 楼 sp1234 的回复:
继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。


首先感谢您热心的回复!其次,如果两者有明显的代码量的区别 我也就不会纠结了,就是因为这两个工作了很相似,所以我才纠结,我想知道一个资深程序员的习惯是怎么做的。是去继承一个接口,还是自己去弄一个方法。就好似接口都是用I开头的一样,这种约定俗成的东西,不会有哪本书会告诉我。所以我才要问。希望能够耐心的给我解答一下!再次感谢!

#4


继承ICloneable接口也是要自己实现拷贝的  你的问题是为什么要继承ICloneable接口  自己写一个不是也可以是实现么   继承ICloneable接口或者IDisposable之类的是一些常用的接口  接口就是规范  假如组里有人要用你的类  如果你自己实现还要告诉人家你这个类里哪个方法是干什么用的  多麻烦   就像你说的 这些常用接口是约定俗成的东西  大家都知道,这样人家马上就知道你这个方法是干什么用的了  不用跑来跑去问来问去了
偶是这么理解的...

#5


我好像突然想明白了。如果 在某个类中,需要调用很多不同的类的 深拷贝功能,就可以继承这个借口,然后通过接口去访问方法,来减少重载的次数,反之,如果只是这个类自己用,而不需要通过接口去调用这个方法,就可以自己写一个 深拷贝的方法了 我说的对么?
举个例子:
class Class1:ICloneable
{
    public object Clone(){................}
}
class Class2:ICloneable
{
    public object Clone(){................}
}
class Class3:ICloneable
{
    public object Clone(){................}
}



class Class//用于调用前边类中的复制功能
{
     public void CloneClass(ICloneable iClone1,ICloneable iClone2)//省去多次重载的麻烦
     {
      iClone2=iClone1.Clone();
      }
}

菜鸟一只。。。例子不贴切 希望有人能看得懂吧

#6


引用 4 楼 chopper7278 的回复:
继承ICloneable接口也是要自己实现拷贝的  你的问题是为什么要继承ICloneable接口  自己写一个不是也可以是实现么   继承ICloneable接口或者IDisposable之类的是一些常用的接口  接口就是规范  假如组里有人要用你的类  如果你自己实现还要告诉人家你这个类里哪个方法是干什么用的  多麻烦   就像你说的 这些常用接口是约定俗成的东西  ……


恩恩 对,这个也是,这样就能统一大家的类中拥有的功能了!

#7


哦,对了 5L的帖子忘了对Clone方法返回的Object进行类型转换了……

#8


恩,说的楼主有些模糊了。我解释下,接口相当于电源插座,他只是个预留的东西,你可以在上边插冰箱、插电脑,它只是把你的用电器囊括到你的家用电器这个行列中,比如说你家没有保存食物的功能,当你插了个冰箱,你家整体就多了个保存食物的功能了。
这个和类继承有区别,接口是程序实现你插上东西的途径,插上的东西是由你决定了,所以楼上说,是否继承接口,写的东西都差不多。

#9


LZ纠结

引用 3 楼 qq446569365 的回复:
引用 1 楼 sp1234 的回复:继承接口跟实现有什么直接关系?如果你说“有个a,我想深拷贝给b”,这跟你用什么接口有什么关系?你继承了接口,不是还要自己写实现方法?跟“直接自己自机械一个深拷贝的方法”有矛盾吗?你听说过继承了某个接口就不用自己写方法了吗?

.net的接口,不会继承任何代码。没听说过因为你给一个class声明它使用一个接口就继承了什么代码来的。
……

接口只是定义一个规范,个人的实现可能都是不一样的。微软只是吧这个规范提供出来,继承接口去实现,或自定义一个类我觉得都可以。但继承接口就要实现接口里面的所以方法,所以这里自己取舍

#10


感谢各位的回答~~我已经知道该怎么做了~谢谢 C#深拷贝的问题……

#11


接口是要自己实现的

        public class Obj : ICloneable
        {
            public Obj() { }
            private Obj(Obj obj) { this.FuckU2 = obj.FuckU2; }
            public bool FuckU2 { get; set; }
            public object Clone()
            {
                return new Obj(this);
            }
        }

#12


关于LZ问的为啥一定要实现接口,而不是自己添加个Clone方法,楼上只是说了很表层的一部分。

.NET之所以提供IDisposable以及IClonable这种看似没什么营养的接口,是有实际用处的,不仅仅是让你看着规范。

其关键用处在于利用OOP的多态特性,实现统一相关操作,以提高互操作性。这是因为.NET Framework很大一部分内容是这个类库,其中一些就Dispose以及Clone相关。比如,using语句(不是名字空间那个)作为C#语法的一部分,要求参数必须是IDisposable类型。