为了账号安全,请及时绑定邮箱和手机立即绑定

在C#中创建对象的副本

在C#中创建对象的副本

C#
富国沪深 2019-08-19 15:35:16
在C#中创建对象的副本请看下面的代码(摘自C#书):public class MyClass {     public int val;}public struct myStruct  {     public int val;}public class Program {     private static void Main(string[] args)      {         MyClass objectA = new MyClass();         MyClass objectB = objectA;         objectA.val = 10;         objectB.val = 20;         myStruct structA = new myStruct();         myStruct structB = structA;         structA.val = 30;         structB.val = 40;         Console.WriteLine("objectA.val = {0}", objectA.val);         Console.WriteLine("objectB.val = {0}", objectB.val);         Console.WriteLine("structA.val = {0}", structA.val);         Console.WriteLine("structB.val = {0}", structB.val);         Console.ReadKey();     }}我知道它会产生以下输出:objectA.val = 20objectB.val = 20structA.val = 30structB.val = 40输出的最后两行我没有问题,但前两个告诉我objectA并objectB指向相同的内存块(因为在C#中,对象是引用类型)。问题是make如何制作objectB,objectA以便它指向内存中的不同区域。我理解,尝试分配他们的成员可能不起作用,因为这些成员也可能是参考。那么我该如何制作objectB一个完全不同的实体objectA呢?谢谢
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

没有内置的方式。你可以让MyClass实现IClonable接口(但它有点不赞成)或只是编写自己的Copy / Clone方法。在任何一种情况下,您都必须编写一些代码。

对于大对象,您可以考虑序列化+反序列化(通过MemoryStream),只是为了重用现有代码。

无论采用何种方法,都要仔细考虑“副本”的含义。它应该有多深,是否有被禁止的Id字段等。


查看完整回答
反对 回复 2019-08-19
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

最简单的方法是在MyClass类中编写一个复制构造函数。

像这样的东西:

namespace Example{
    class MyClass
    {
        public int val;

        public MyClass()
        {
        }

        public MyClass(MyClass other)
        {
            val = other.val;
        }
    }}

第二个构造函数只接受他自己类型的参数(您要复制的参数)并创建一个分配了相同值的新对象

class Program{
    static void Main(string[] args)
    {
        MyClass objectA = new MyClass();
        MyClass objectB = new MyClass(objectA);
        objectA.val = 10;
        objectB.val = 20;
        Console.WriteLine("objectA.val = {0}", objectA.val);
        Console.WriteLine("objectB.val = {0}", objectB.val);
        Console.ReadKey();
    }}

输出:

objectA.val = 10objectB.val = 20


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 880 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信