2013-06-12 69 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現在的引用包含空值。