新人学习C#时候遇到一个小问题,一直想不明白,是关于new的用法的

苏小泉 2018-08-08 09:43:20
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 什么关系?
...全文
1510 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
风吹腚腚凉 2018-08-13
  • 打赏
  • 举报
回复
引用 35 楼 sp1234 的回复:
说得再白一些,任何一次代码修改原则上对于整个代码都需要回归测试,要有“归零的心态”。一个产品版本测试了几万遍然后发了一版,当发现了一个 bug 并且修复了之后,那么重新测试几万遍才敢重新发布下一个版本。绝不是得过且过地以为手工调试一下这一个bug的修复情况就发布。

养成了习惯,你就有务实的精神。什么“死记硬背”之类的都无所谓了,有本事别人来测试你的代码就好了,你何必要把别人发现任何问题都归结为自己不会超人地去死记硬背呢?

你说的是炒股吧?
风吹腚腚凉 2018-08-13
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
List<INode> result = new List<INode>(myChildren);
是从已有的 myChildren 集合创建一个新集合 result 的意思

看不看源码并无所谓,但看原型声明就很重要
方法重载太多了感觉都记不住
其实 vs 提供了强大的帮助功能,只要你按你想象的方式书写代码,vs 就会立即告诉你是否合适(如果不行,你可以自行扩展)
这里,并不需要什么记忆

做软件开发,需要的是天马行空,而不是亦步亦趋


你说的那个是做产品的吧,而不是开发的吧?
  • 打赏
  • 举报
回复
说得再白一些,任何一次代码修改原则上对于整个代码都需要回归测试,要有“归零的心态”。一个产品版本测试了几万遍然后发了一版,当发现了一个 bug 并且修复了之后,那么重新测试几万遍才敢重新发布下一个版本。绝不是得过且过地以为手工调试一下这一个bug的修复情况就发布。

养成了习惯,你就有务实的精神。什么“死记硬背”之类的都无所谓了,有本事别人来测试你的代码就好了,你何必要把别人发现任何问题都归结为自己不会超人地去死记硬背呢?
  • 打赏
  • 举报
回复
关于说“记不住”的问题,其实我们记住的更少!!

关键在,我是“以测试为准”的,而有的人是以书上说的为准。这两种差别是巨大的,简直可以说是背道而驰。我不信书、不信 msdn,自然也不纠结什么死记硬背。
ireenter 2018-08-09
  • 打赏
  • 举报
回复
//List<INode> result = new List<INode>(myChildren);

result只是产生一个新的结果集,结果集的元素仍然是指向已知列表的元素(add只是引用地址,不是产生一个新的myChildren)。
xuzuning 2018-08-08
  • 打赏
  • 举报
回复
List<INode> result = new List<INode>(myChildren);
是从已有的 myChildren 集合创建一个新集合 result 的意思

看不看源码并无所谓,但看原型声明就很重要
方法重载太多了感觉都记不住
其实 vs 提供了强大的帮助功能,只要你按你想象的方式书写代码,vs 就会立即告诉你是否合适(如果不行,你可以自行扩展)
这里,并不需要什么记忆

做软件开发,需要的是天马行空,而不是亦步亦趋
  • 打赏
  • 举报
回复
就是说,学习一套编程系统完全靠自己。需要自己查看源代码,然后一个人整个的素质产生了改变。不看源码不行。
  • 打赏
  • 举报
回复
比如说这段源码,里边有其内涵,它区分两种情况,对于实现了 ICollection<> 接口的参数对象进行了优化。

慢慢地你接触的程序员就会明显感觉到,真正的程序员不是因为抄了很多东西所以到处套用,到处套用笔记的实际上只是刚学编程的。
  • 打赏
  • 举报
回复
不是看定义,而是要看 .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;
}


慢慢你会发现,程序员分为两种,一种就是只会抄,一种就是自己找源码分析。
苏小泉 2018-08-08
  • 打赏
  • 举报
回复
引用 4 楼 closurer 的回复:
new 会调用类的构造函数,其行为由这个构造函数决定。

你调用的 List<T> 构造函数重载,是根据一个可枚举类型创建 List<T> 实例。
噢噢明白了,其实就是一个固定用法的意思。没有点进去看定义。而且我感觉C#里边方法重载太多了感觉都记不住,尤其是刚刚接触的时候看到一大堆不知道用哪个才对。
苏小泉 2018-08-08
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
引用 3 楼 m0_37953670 的回复:
[quote=引用 2 楼 sp1234 的回复:]
GetChildren 返回的不是 myChildren,而是产生的一个新的集合。只不过集合内容包括了 myChildren 的所有内容。
多谢回答,你这么一说我就知道了。请问这是new通用的用法吗?


这是 List<> 的带参数实例化方法的功能。

学习 .net 要看源代码,不要仅仅纠结概念。只有读源代码、自己写测试程序,才是准绳。一切理论都不是真理。[/quote]好的明白了,请问源代码是指什么?点进去各个函数看定义里面的内容吗?
  • 打赏
  • 举报
回复
引用 3 楼 m0_37953670 的回复:
引用 2 楼 sp1234 的回复:
GetChildren 返回的不是 myChildren,而是产生的一个新的集合。只不过集合内容包括了 myChildren 的所有内容。
多谢回答,你这么一说我就知道了。请问这是new通用的用法吗?


这是 List<> 的带参数实例化方法的功能。

学习 .net 要看源代码,不要仅仅纠结概念。只有读源代码、自己写测试程序,才是准绳。一切理论都不是真理。
闭包客 2018-08-08
  • 打赏
  • 举报
回复
new 会调用类的构造函数,其行为由这个构造函数决定。

你调用的 List<T> 构造函数重载,是根据一个可枚举类型创建 List<T> 实例。
苏小泉 2018-08-08
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
GetChildren 返回的不是 myChildren,而是产生的一个新的集合。只不过集合内容包括了 myChildren 的所有内容。
多谢回答,你这么一说我就知道了。请问这是new通用的用法吗?
  • 打赏
  • 举报
回复
这是copy了一下集合,使用 mychildren 产生了另外一个集合,以免在多线程操作时产生“集合被修改”这类崩溃。
  • 打赏
  • 举报
回复
GetChildren 返回的不是 myChildren,而是产生的一个新的集合。只不过集合内容包括了 myChildren 的所有内容。
圣殿骑士18 2018-08-08
  • 打赏
  • 举报
回复
引用 7 楼 m0_37953670 的回复:
[quote=引用 4 楼 closurer 的回复:]
new 会调用类的构造函数,其行为由这个构造函数决定。

你调用的 List<T> 构造函数重载,是根据一个可枚举类型创建 List<T> 实例。
噢噢明白了,其实就是一个固定用法的意思。没有点进去看定义。而且我感觉C#里边方法重载太多了感觉都记不住,尤其是刚刚接触的时候看到一大堆不知道用哪个才对。[/quote]
.net类库丰富的重载,是拿来“用”的,不是拿来“记”的。因为太多记不住。
也有不少人,甚至是有开发经验的人,喜欢把.net类库的一些方法,挑挑拣拣,再封装成自己的一个类库,我觉得这种做法毫无意义。
为什么这么做,就是因为觉得方法太多,记不住,所以挑一些常用的进行封装。但我觉得这不是好的对.net类库的用法。
好的用法应该是这样:
碰到一个问题,首先想:我觉得应该用xxxx的办法可以简单的解决问题,然后到类库里找相应的重载方法。找不到,才再自己封装。
圣殿骑士18 2018-08-08
  • 打赏
  • 举报
回复
在方法上,按F12,可以看到类库方法注释。
圣殿骑士18 2018-08-08
  • 打赏
  • 举报
回复
学会看注释:
//
// 摘要:
// 初始化 System.Collections.Generic.List`1 类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素。
//
// 参数:
// collection:
// 一个集合,其元素被复制到新列表中。
//
// 异常:
// T:System.ArgumentNullException:
// collection 为 null。
苏小泉 2018-08-08
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
就是说,学习一套编程系统完全靠自己。需要自己查看源代码,然后一个人整个的素质产生了改变。不看源码不行。
了解了,看源码确实可以帮助理解,多谢啦~
加载更多回复(1)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧