【问题标题】:C# Pointer to object?C# 指向对象的指针?
【发布时间】:2013-06-15 01:19:48
【问题描述】:

我需要“复制”一个对象。我尝试使用 IClonable 接口,但无济于事,对我来说最明智的解决方案是使用不安全代码创建指向对象的指针,然后在 C 中编写类似 Memcpy 的方法。唯一的问题是创建指向托管类型的指针.我假设这样做会给垃圾收集器带来问题,但是如果可以使用封送处理或其他东西来创建指向托管对象的指针,那么我可以在 C 中编写一个类似 memcpy 的函数,然后复制我的对象。如果结构可以不受管理,那么为什么对象不能呢?一个对象本质上是一个结构指针,所以理论上它应该等于 IntPtr 的大小,对吧?

【问题讨论】:

  • 您要复制的对象是什么?你是如何实现IClonable.Clone 方法的?您是否调用您的Clone() 方法?您是否尝试将 C# 对象复制/传递给 C 程序?
  • 是的,我当然做到了。我的对象包含一个未克隆的 List 对象(我认为这与 IClonable 接口仅提供浅克隆方法有关。)
  • 那些想法很糟糕。只需创建一个复制构造函数或实现IClonable,无论哪种方式都无所谓。您必须编写一个方法,将新对象中的每个值设置为旧对象中的值。
  • @user1454902 所有ICloneable 所做的只是让您实现Clone() 方法。将其实现为浅克隆还是深度克隆取决于您。我认为,如果您发布尝试的代码并描述它到底是如何不起作用的,这将有所帮助。
  • 让我们看看你的代码是否可以克隆?

标签: c# pointers unmanaged


【解决方案1】:

我自己解决了这个问题,对于那些说我使用指针的想法的人,这来自我的 C 语言背景......无论如何,使用序列化这个方法完全符合我的需要。

    public object Clone()
    { 
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(ms, this);
            ms.Position = 0;
            return formatter.Deserialize(ms);
        }
    }

【讨论】:

  • 这是对复杂对象进行深拷贝的一个很好的解决方案。
  • @user,我很高兴您找到了解决方案,并在此处转了圈。我自己也使用过这种方法。但是,您在问题中所做的假设表明您对 C#(在 CLR 中 - 或 JVM 中的 Java)等托管语言的实际工作方式存在很多误解。首先,你可以“memcopy”一个对象并获得一个新对象的想法忽略了垃圾收集的概念。 GC 系统如何知道它最终需要释放该内存? (无论如何,CLR 必须知道所有对象才能让 CLR 工作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2023-02-09
  • 1970-01-01
  • 2012-10-12
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多