为什么CodeContracts建议在foreach循环中进行空检查?

本文关键字:检查 循环 CodeContracts foreach 为什么 | 更新日期: 2023-09-27 18:18:20

我有这样的代码:

foreach (UIElement uiElement in list)
{
    uiElement.SetValue(Grid.ColumnProperty, colunmn++);
    uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
    _uiRoot.Children.Add(uiElement);
}

它运行良好,但Code Contracts给了我一个警告:可能在null引用上调用方法,uiElement。

元素怎么可能是空的?该列表是UIElementList,因此它应该遍历列表而不包含任何null。

为什么CodeContracts建议在foreach循环中进行空检查?

因为您可以在列表中添加空值,即使您可能不这样做

你可以做

foreach (UIElement uiElement in list.Where(e => e != null))
{
   uiElement.SetValue(Grid.ColumnProperty, colunmn++);
   uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count -1);
   _uiRoot.Children.Add(uiElement);
}

列表可以包含空引用。您可以在列表中插入null。您还可以将一个好的引用插入到列表中,然后稍后将其设置为空。例如,如果我有一个People列表,我可以有这个列表:"鲍勃"、"弗雷德"。现在我从列表中获取Bob,做一些事情,并将其更改为null。列表包含引用列表,而不是项列表。它指向物品所在的位置。现在,当您遍历列表时,位置0现在为空,因为Bob所在的引用现在包含空。