none
List.Add 是深度复制还是只加了个引用进去? RRS feed

  • 问题

  • List.Add 是复制了一个对象,还是只是保存了对象的引用?比如以下的代码,会发生什么情况?

    class Mydata // 一个简单的数据类
    {
      public int Int1;
    }

    List<Mydata> list = new List<Mydata>();
    Mydata data = new MyData();

    data.Int1 = 3;
    list.Add(data);

    data.Int1 = 9;
    list.Add(data);

    data.Int1 = 777;
    list.Add(data);

    最后list里的是 3 9 777, 还是777 777 777 ?


    个人感觉应该是放了个引用进去,但像上面这样引用被修改掉的话,似乎又不太符合List 这一类的功能。
    霸王
    2010年3月14日 9:43

答案

  • List<T>保存的是对象的引用,因此以上代码运行后list中三个对象(其实是同一个)的Int1值都为777
    List<T>内部是使用数组保存对象的引用的

    private T[] _items;
    private int _size;
    private int _version;
    public void Add(T item)
    {
        if (this._size == this._items.Length)
        {
            this.EnsureCapacity(this._size + 1);
        }
        this._items[this._size++] = item;
        this._version++;
    }


    共同努力,共同提高
    kaedei#live.cn My BLOG
    • 已标记为答案 Jimt200010 2010年3月14日 12:52
    2010年3月14日 10:35

全部回复

  • List<T>保存的是对象的引用,因此以上代码运行后list中三个对象(其实是同一个)的Int1值都为777
    List<T>内部是使用数组保存对象的引用的

    private T[] _items;
    private int _size;
    private int _version;
    public void Add(T item)
    {
        if (this._size == this._items.Length)
        {
            this.EnsureCapacity(this._size + 1);
        }
        this._items[this._size++] = item;
        this._version++;
    }


    共同努力,共同提高
    kaedei#live.cn My BLOG
    • 已标记为答案 Jimt200010 2010年3月14日 12:52
    2010年3月14日 10:35
  • 确实如此,扔进list里之后就最好别再用原来的变量了,否则会头大的 = =

    再说,list也不知道怎么个深度复制法(实现了IClonable接口估计也没有什么好转)

    c#里还是多用new吧,咱不在乎这么点内存……
    霸王
    2010年3月14日 12:52
  • 你好!
         对于List<T>来说,如果T是引用类型,那保存的是引用,如果是值类型,保存的是值本身!

    周雪峰
    2010年3月14日 14:36
    版主
  • 恩,这个知道,就跟“函数参数默认是传值而不是引用”类似。

    现在是在数据类中加了个接口,用类似Clone() 的深度复制来实现的。

    霸王
    2010年3月14日 15:18
  • 还是没有看到 这个结果是?什么呀?
    2011年4月4日 15:41