2013-06-12 70 views
1

建议空校验我有这样的代码:为什么CodeContracts在foreach循环

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

它运行良好,但代码契约是给我一个警告:可能调用空引用,的UIElement的方法。

uiElement如何为空?该列表是一个ListUIElement s,因此它应该遍历列表没有任何空值。

+2

你可以把空值在列表中 –

+0

无关:你不应该在这样做程序代码。创建一个合适的ViewModel并使用DataBinding。 –

回答

2

因为你可以把空值在列表中,即使你可能不会

你可以做

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); 
} 
+0

谢谢,我喜欢linq null检查。 –

+0

如果你额外的超级承诺永远不会将空值放入'list'中,你可以跳过开销,只需使用'Contract.Assume(uiElement!= null)'作为循环中的第一行。 – Dandy

1

一个列表可以包含空引用。您可以将空值插入到列表中。您也可以在列表中插入一个很好的参考,然后将其设置为null。 例如,如果我有人员列表,我可以列出: “Bob”,“Fred”。 现在我从列表中抓取Bob,做一些事情,并将其更改为null。 列表包含“引用”而不是“项目”列表。所以它指向物品所在的位置。现在,当您遍历列表时,位置0现在为空,因为Bob现在的引用包含空值。