为什么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。
元素怎么可能是空的?该列表是UIElement
的List
,因此它应该遍历列表而不包含任何null。
因为您可以在列表中添加空值,即使您可能不这样做
你可以做
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所在的引用现在包含空。