屈服于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#2.0中的关键字行为

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,并确保比较相等的对象具有相同的哈希代码。