【问题标题】:An issue with Dictionary and ArrayListDictionary 和 ArrayList 的问题
【发布时间】:2013-11-20 11:42:36
【问题描述】:

我有一个字典,其中 RFile 是一个类,该字典包含将在列表视图中显示的所有数据。

问题是这样的:程序将使用从关联的 listViewItem 获得的键从字典中获取 RFile 类,然后将其添加到 ArrayList

ArrayList Files = new ArrayList();
Foreach (ListViewItem lvi in LV.Groups[1].Items)
     {
          Files.Add(Dict[lvi.tag]);
     }

然后 ArrayList 中的 Files 由 VALUE(没有将 Ref 放在方法标识符中)发送到一个方法,该方法将处理它们并对 Files ArrayList 中的条目进行一些更改,但是这些更改也适用于原始字典(而且我的值没有改变)

我只知道我不会通过引用传递任何数据,除非使用键从字典中获取值是通过引用完成的。

提前谢谢大家。

【问题讨论】:

  • 当您执行Files.Add(Dict[lvi.tag]) 时,您实际上只是在字典中添加对与lvi.tag 关联的对象的引用。如果您不想传播更改,则必须复制该对象。

标签: c# dictionary arraylist


【解决方案1】:

我认为你需要一个关于ValueTypesReferenceTypes 的教程。

既然RFile 是一个类,那么对RFile 实例的任何更改都将反映在它共享相同RFile 实例的所有其他地方,因为它是一个“引用类型”,无论你通过它是否为ref

ref 关键字的目的不同,这超出了这个问题的重点。您可能还需要了解 ref 关键字。

这里有一个关于Value type vs Reference type的好资源

【讨论】:

    【解决方案2】:

    类总是通过引用传递,即使你不使用 ref 关键字。

    您可以实现 ICloanable-interface 并克隆您的对象,因此更改不会影响原始对象:

    ArrayList Files = new ArrayList();
    Foreach (ListViewItem lvi in LV.Groups[1].Items)
    {
              Files.Add(Dict[lvi.tag].Clone());
    }
    

    public class RFile : ICloanable{
    //Your RFile-code here
    }
    

    【讨论】:

    • 感谢您指出类数据在所有实例之间共享,我从来不知道。我想知道(只是为了了解更多)是否有另一种方法可以在不添加界面的情况下进行克隆?
    • 您当然可以定义自己的方法来克隆对象,但 ICloanable 接口是执行此操作的默认方式。您可以在 MSDN 库 msdn.microsoft.com/library/system.icloneable(v=vs.110).aspx 阅读有关 IClonable 的信息
    • 非常感谢,感谢您,我的问题得到了解决。我决定定义自己的克隆方法。再次感谢您
    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2015-08-19
    • 1970-01-01
    相关资源
    最近更新 更多