2010-05-20 155 views
5

例如。比方說,我們有一個窗體上的堆棧面板。它充滿了網格和標籤。我想循環遍歷所有的網格,並對它們進行一些操作,但完整地保留了Lables。目前我正在這樣做。使用「as」並期望返回空值

foreach(UIElement element in m_stacker.Children) 
{ 
    Grid block = element as Grid; 
    if(block != null) 
    { 
     //apply changes here 
    } 
} 

因此,我使用「as」如果它不能轉換爲所需的類型返回null的事實。這是一件好事嗎?還是有更好的解決方案來解決這個問題?

+7

實際上,這可能是'as'最常見的用例。 – 2010-05-20 11:22:12

+0

感謝所有的迴應傢伙。我會堅持「as」看起來像是正確的事情。 – DrLazer 2010-05-20 12:47:22

回答

2

它會正常工作。你可以做的只是使用「是」。

foreach(UIElement element in m_stacker.Children) 
{ 
    if(element is Grid) 
    { 
     //apply changes here 
    } 
} 
+1

僅當您不需要訪問「Grid」的屬性和方法時。 – ChrisF 2010-05-20 11:21:33

+0

很明顯你需要施放它。 :) – sovanesyan 2010-05-20 13:20:42

13

OfType()怎麼樣?

foreach(var grid in m_stacker.Children.OfType<Grid>()) { ... } 

這將僅環比型電網的孩子,所以沒必要投或全部檢查類型。

+3

事實上,'OfType ()'在內部完全一樣。 ;-) – Oliver 2010-05-20 11:36:13

+3

@Oliver:但代碼看起來更易讀,並且這種方式更短。 – tanascius 2010-05-20 11:38:03

+1

'OfType'是過濾出集合中某個類型元素的好方法。然而,如果你想在一個集合中使用不同對象做不同的事情('var g = o as Grid; if(g!= null){/ * do this * /} else {var c = o as Canvas; if (c!= null){/ * do that * /}}'),你必須用'OfType'迭代集合幾次 - 當你有一個對象而不是集合時,它不是一個選擇。 – 2010-05-20 11:43:13

2

如果你打算使用block作爲Grid那麼這是正確的編碼方式。

使用is(在我看來)檢查產生如以下兩個例子說明的可讀性代碼:

if (element is Grid) 
{ 
    Grid block = element as Grid; 
    // Do stuff 
} 

if (element is Grid) 
{ 
    Grid block = (Grid)element; 
    // Do stuff 
} 

不要做這兩種的。

你在說如果元素是一個網格然後施放它。

+0

代碼分析建議不要像你寫的那樣做。最好的方法,因爲它認爲使用運算符'as'並檢查到'null'。 – abatishchev 2010-05-20 11:31:59

+0

@abatishchev - 同意 - 我強調了你**不應該做的事情。 – ChrisF 2010-05-20 11:33:30

+0

我同意。雖然,'我'認爲'絕對沒有錯,因爲'在大多數情況下絕對會更好。 – 2010-05-20 13:02:45