【问题标题】:Changing a variable changes also another variable. Prevent variables having the same reference改变一个变量也会改变另一个变量。防止变量具有相同的引用
【发布时间】:2011-08-31 13:59:44
【问题描述】:

我有一个类,构造函数需要一个类和其他类似的东西:

public class SomeClass<T>
{
    //global private variables for class
    List<T> originalList = new List<T>;
    List<T> tempList = new List<T>;

    public SomClass(List<T> listParam, string name, ..etc)
    {
        originalList = listParam;
        tempList = listParam;

        originalList.removeAt(0);  // this also removes an item from tempList.


    }
}

我知道这是因为 originalList 和 tempList 具有相同的引用。我怎么能让他们有不同的参考。我使用 tempList 过滤结果,每当我想刷新时,我都会使用 originalList

【问题讨论】:

    标签: c# pass-by-reference pass-by-value


    【解决方案1】:

    不要接受List&lt;T&gt;,而是接受IEnumerable&lt;T&gt;。如果您想要一个具体的列表,请致电.ToList()

    原始来源不受影响,您有一份副本。您还可以使用任何支持该接口的东西。

    编辑:我误读了问题中的代码,您的副本属于同一类。嗯,它在两个地方,类调用者。我支持我的建议,但是是的,您需要两次调用 .ToList(),每个副本一次。

    【讨论】:

    • “不接受 List,而是接受 IEnumerable”——当他特别需要一个列表时,有什么理由这样做吗?
    • @zerkms,为了在课堂上提供更多支持。它支持任何类型的 T 序列,它不需要是特定的实现。如果他想要支持的只是具体的实现,那么他有这个选择。但是使用限制最少的界面只会给他更多的选择,仅此而已。
    • 是的,提供了更多选项,并且每次都需要复制列表(即使我们不需要副本并且列表很大);-)
    • @zerkms,无论如何他都必须按照他的要求复制列表。但是,是的,为了在他的班级中支持 两个 独立列表,他会使用这种方法复制两次。但是,如果他希望来源处的列表保持独立,他仍然需要这样做。
    【解决方案2】:

    您可以复制listParam,而不仅仅是指定其引用:

    tempList = listParam.ToList();
    

    请注意,这不会创建列表中每个对象的副本,而只是创建对这些对象的引用的副本。

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 1970-01-01
      • 2015-03-03
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      相关资源
      最近更新 更多