C#2.0中的yield关键字行为

| 在一种方法中,我产生了一个自定义对象,可以重用。以后再屈服。
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
将继续您放置它们的循环。因此,循环之前的代码仅在进入循环之前执行一次。您将不得不在循环内将“ 5”返回的对象“ 5”。 也就是说,您将不得不更换
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
,并确保比较相等的对象具有相同的哈希码。     

要回复问题请先登录注册