2010-05-20 87 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