屈服于C#2.0中的关键字行为
本文关键字:关键字 C#2 屈服于 | 更新日期: 2023-09-27 17:59:16
在一个方法中,我生成了一个可重用的自定义对象。后来又屈服了。
private IEnumerable<DistributorMonthlyComparisonData> ExtractMonthlyAggregate(String CSVFilepath)
{
DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
while (!reader.EndOfStream)
{
if(something){
// fill unitData
}
else{
yield return unitData;
}
}
}
在我程序中的另一个对象中,我以这种方式调用上述方法:
List<DistributorMonthlyComparisonData> distribList = new List<DistributorMonthlyComparisonData>();
foreach (DistributorMonthlyComparisonData result in ExtractMonthlyAggregate(percorso))
{
distribList.Add(result);
}
如果我不在yield方法中创建,在每次yield之后,一个新的对象
unitData = new DistributorMonthlyComparisonData();
我得到的只是一个相同对象的列表。
我想知道:这是因为unitData是作为引用传递的,因此List只是对同一个相同对象的引用列表吗?每次更改传递的unitData对象的哈希时,都要创建一个新的unitData()?
请启发我。:)
编辑我很感兴趣为什么会发生这种情况。我曾经认为,该框架应该对对象进行写时复制,所以基本上只生成一个对象,然后修改其属性,然后再次生成它,应该会导致将两个不同的对象添加到列表中。
C#具有类类型的引用语义,因此您对返回的引用是正确的。
关于其余部分的旁注:
yield return
/yield break
将继续您放置它们的循环。因此,在进入循环之前,循环之前的代码只执行一次。您必须在循环内new
您返回的对象。
也就是说,你必须更换
DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
while (!reader.EndOfStream) {
...
带有
while (!reader.EndOfStream) {
DistributorMonthlyComparisonData unitData = new DistributorMonthlyComparisonData();
...
我想知道:这是因为unitData是作为引用传递的,因此List只是对同一个相同对象的引用列表吗?
没错。
每次更改传递的unitData对象的哈希时,都要创建一个新的unitData()?
这取决于DistributorMonthlyComparisonData对GetHashCode()的实现。
对象初始化只会发生一次。执行将从while循环开始,从第二次迭代开始。这就是对象集合具有相同对象实例的原因。
每次更改传递的unitData对象的哈希时,都要创建一个新的unitData()?
没有GetHashCode()的实现,DistributorMonthlyComparisonData只是属性的集合。
GetHashCode()
的默认实现不保证其返回值。所以,如果你没有自定义的实现,你就不应该对它有任何期望
为类型定义相等时(通过重写Equals
),还必须重写GetHashCode
,并确保比较相等的对象具有相同的哈希代码。