例如。假设我们在表单上有一个stackpanel。它充满了网格和标签。我想循环遍历所有网格并对它们进行一些操作,但保留Lables完整。目前我正是这样做的。
foreach(UIElement element in m_stacker.Children)
{
Grid block = element as Grid;
if(block != null)
{
//apply changes here
}
}
所以我正在使用“as”如果无法转换为所需类型则返回null的事实。这是一件好事还是有更好的解决方案来解决这个问题?
答案 0 :(得分:13)
OfType()怎么办?
foreach( var grid in m_stacker.Children.OfType<Grid>() ) { ... }
这将仅循环到 Grid 类型的子项,因此根本不需要强制转换或检查类型。
答案 1 :(得分:8)
是的,这是正确的方法(考虑“应用更改”将需要使用演员结果)。
但是,如果您不打算使用强制转换值,则只需使用is
。
使用is
然后casting again with the cast operator (parenthesis) is frowned upon。
答案 2 :(得分:2)
它会正常工作。但你可以做的只是使用“是”。
foreach(UIElement element in m_stacker.Children)
{
if(element is Grid)
{
//apply changes here
}
}
答案 3 :(得分: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
}
不要执行其中任何一项。
你说的是元素是一个网格然后投射它。