public class CNode:INode
    {
        private List<INode> myChildren = new List<INode>();
        public CNode(string SName)
        {
            Name = SName;
        }
        public string Name { get; set; }
        
        public void AddChild(INode node)
        {
            myChildren.Add(node);
        }        public void RemoveChild(INode node)
        {
            myChildren.Remove(node);
        }        public List<INode> GetChildren(bool searchAll)
        {
          //  List<INode> result = new  List<INode>(myChildren);
            List<INode> result = new List<INode>(myChildren);
        
            if(searchAll)
            {
                foreach(INode node in myChildren)
                {
                    List<INode> child = node.GetChildren(true);
                    if(child.Count>0)
                    {
                        result.AddRange(child);
                    }
                }
               
            }
            return result;
        }        public List<INode> GetChildren()
        {
            return GetChildren(false);
        }
    }
在以上代码中,类CNode中一开始就定义了一个List<INode> myChildren ,
但是在后面GetChildren方法中由对result定义:List<INode> result = new List<INode>(myChildren);
我想问这个myChildren 不是已经定义过了吗?这里面对result定义完以后和myChildren 什么关系?

解决方案 »

  1.   

    这是copy了一下集合,使用 mychildren 产生了另外一个集合,以免在多线程操作时产生“集合被修改”这类崩溃。
      

  2.   

    GetChildren 返回的不是 myChildren,而是产生的一个新的集合。只不过集合内容包括了 myChildren 的所有内容。
      

  3.   

    多谢回答,你这么一说我就知道了。请问这是new通用的用法吗?
      

  4.   

    new 会调用类的构造函数,其行为由这个构造函数决定。你调用的 List<T> 构造函数重载,是根据一个可枚举类型创建 List<T> 实例。
      

  5.   


    这是 List<> 的带参数实例化方法的功能。学习 .net 要看源代码,不要仅仅纠结概念。只有读源代码、自己写测试程序,才是准绳。一切理论都不是真理。
      

  6.   


    这是 List<> 的带参数实例化方法的功能。学习 .net 要看源代码,不要仅仅纠结概念。只有读源代码、自己写测试程序,才是准绳。一切理论都不是真理。好的明白了,请问源代码是指什么?点进去各个函数看定义里面的内容吗?
      

  7.   

    不是看定义,而是要看 .net 源代码。vs可以加载源代码,或者使用一个反编译工具。随便一个工具,1秒钟你就能看到代码:public List(IEnumerable<T> collection)
    {
    if (collection == null)
    {
    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
    }
    ICollection<T> collection2 = collection as ICollection<T>;
    if (collection2 == null)
    {
    this._size = 0;
    this._items = List<T>._emptyArray;
    using (IEnumerator<T> enumerator = collection.GetEnumerator())
    {
    while (enumerator.MoveNext())
    {
    this.Add(enumerator.Current);
    }
    }
    return;
    }
    int count = collection2.Count;
    if (count == 0)
    {
    this._items = List<T>._emptyArray;
    return;
    }
    this._items = new T[count];
    collection2.CopyTo(this._items, 0);
    this._size = count;
    }慢慢你会发现,程序员分为两种,一种就是只会抄,一种就是自己找源码分析。
      

  8.   

    比如说这段源码,里边有其内涵,它区分两种情况,对于实现了 ICollection<> 接口的参数对象进行了优化。慢慢地你接触的程序员就会明显感觉到,真正的程序员不是因为抄了很多东西所以到处套用,到处套用笔记的实际上只是刚学编程的。
      

  9.   

    List<INode> result = new List<INode>(myChildren);
    是从已有的 myChildren 集合创建一个新集合 result 的意思看不看源码并无所谓,但看原型声明就很重要
    方法重载太多了感觉都记不住
    其实 vs 提供了强大的帮助功能,只要你按你想象的方式书写代码,vs 就会立即告诉你是否合适(如果不行,你可以自行扩展)
    这里,并不需要什么记忆做软件开发,需要的是天马行空,而不是亦步亦趋
      

  10.   

    学会看注释:
    //
            // 摘要:
            //     初始化 System.Collections.Generic.List`1 类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素。
            //
            // 参数:
            //   collection:
            //     一个集合,其元素被复制到新列表中。
            //
            // 异常:
            //   T:System.ArgumentNullException:
            //     collection 为 null。
      

  11.   

    .net类库丰富的重载,是拿来“用”的,不是拿来“记”的。因为太多记不住。
    也有不少人,甚至是有开发经验的人,喜欢把.net类库的一些方法,挑挑拣拣,再封装成自己的一个类库,我觉得这种做法毫无意义。
    为什么这么做,就是因为觉得方法太多,记不住,所以挑一些常用的进行封装。但我觉得这不是好的对.net类库的用法。
    好的用法应该是这样:
    碰到一个问题,首先想:我觉得应该用xxxx的办法可以简单的解决问题,然后到类库里找相应的重载方法。找不到,才再自己封装。
      

  12.   

    //List<INode> result = new List<INode>(myChildren);result只是产生一个新的结果集,结果集的元素仍然是指向已知列表的元素(add只是引用地址,不是产生一个新的myChildren)。
      

  13.   

    关于说“记不住”的问题,其实我们记住的更少!!关键在,我是“以测试为准”的,而有的人是以书上说的为准。这两种差别是巨大的,简直可以说是背道而驰。我不信书、不信 msdn,自然也不纠结什么死记硬背。
      

  14.   

    说得再白一些,任何一次代码修改原则上对于整个代码都需要回归测试,要有“归零的心态”。一个产品版本测试了几万遍然后发了一版,当发现了一个 bug 并且修复了之后,那么重新测试几万遍才敢重新发布下一个版本。绝不是得过且过地以为手工调试一下这一个bug的修复情况就发布。养成了习惯,你就有务实的精神。什么“死记硬背”之类的都无所谓了,有本事别人来测试你的代码就好了,你何必要把别人发现任何问题都归结为自己不会超人地去死记硬背呢?