为何示例中foo与bar的Count()结果不同?bar不是foo的引用吗?
为何foo与bar的Count()结果不一致?
先看你给出的代码:
IEnumerable<string> foo = new List<string> { "a", "b" }; var bar = foo; foo = foo.Skip(1); // foo.Count() = 1 // bar.Count() = 2
核心问题出在引用类型变量的赋值逻辑上:
- 一开始
foo指向的是一个包含两个元素的List<string>对象。 - 执行
bar = foo后,bar和foo确实指向同一个List实例,这时候两者是“同一份引用”。 - 关键是第三步
foo = foo.Skip(1):Skip()方法不会修改原来的List,它会返回一个全新的IEnumerable<string>实例,这个实例代表的是跳过原集合第一个元素后的序列。这时候foo变量的引用被替换成了这个新实例,但bar还是牢牢指向最初的那个List对象。
所以最后调用Count()时:
foo.Count()统计的是Skip返回的新序列的长度,结果是1。bar.Count()统计的是最初那个List的元素数量,结果是2。
说白了就是:bar存的是最初List的引用,而foo后来被重新赋值成了新的序列,两者指向的已经不是同一个对象了。
内容的提问来源于stack exchange,提问作者filur
相关产品推荐
相关产品推荐

