【问题标题】:c# List<myObject> myList.copyTo() keeps a reference?c# List<myObject> myList.copyTo() 保留引用?
【发布时间】:2010-11-21 08:52:06
【问题描述】:

我有一个列表,我使用了 .copyTo() 方法。所以它将我的 List 复制到一维数组中。

所以我循环这个数组并将每个 myObject 添加到另一个列表中,然后我正在更改这个新列表中的内容。

在此之后,我将展示我的第二个列表中的新值与我的第一个列表中的旧值之间的差异。但始终没有区别。所以我认为 copyTo() 方法会保留一个引用。

还有其他不保留引用的方法吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    是的。 .CopyTo() 执行浅拷贝,这意味着它会复制引用。你需要的是一个深拷贝,通过克隆每个对象。

    最好的办法是让你的myObject类实现IClonable

    public class YourClass 
    {
        public object Clone()
        {
            using (var ms = new MemoryStream())
            {
               var bf = new BinaryFormatter();
    
               bf.Serialize(ms, this);
               ms.Position = 0;
    
               object obj = bf.Deserialize(ms);
               ms.Close();
    
               return obj;
            }
        }
    }
    

    然后您可以在每个对象上收集 .Clone() 并将其添加到新列表中。

    List<YourClass> originalItems = new List<YourClass>() { new YourClass() };
    List<YourClass> newItemList = originalItems.Select(x => x.Clone() as YourClass).ToList();
    

    【讨论】:

    • 所以我必须将 IClonable 添加到我的对象中?然后是克隆方法?
    • 不要使用IClonable,只需编写自己的方法来进行深拷贝
    • @约翰。那也很好。已编辑。
    • 对 MemoryStream (IDisposable) 更好地使用“使用”
    • @StanR。谢谢。真的很有帮助。
    【解决方案2】:

    如果你有一个引用类型的 List,并且你使用 CopyTo 方法复制到一个数组,那么 List 中的 references 的内容将被复制,所以当你修改数组中的对象,它们仍然会引用堆上从列表中引用的相同对象。

    【讨论】:

    • 这是我的情况。有其他解决方案吗?
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2017-10-17
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多