我发现使用以下内容:
TreeViewItem i = sender as TreeViewItem; if(i != null){ ... }
比以下更容易编写和理解:
if(sender.GetType() == typeof(TreeViewItem)){ TreeViewItem i = (TreeViewItem)sender; ... }
有没有令人信服的理由不使用第一个结构?
as
在大多数情况下,我更喜欢强制转换,因为通常如果对象的类型错误,则表示存在错误.错误应该导致异常IMO - 并且InvalidCastException
执行转换的行恰好比NullReferenceException
代码中的更晚更清楚.
as
应该在有效且合法的情况下使用,以便传递对您不想要的类型的对象的引用.确实出现了这种情况,但并不像我的经验那样经常进行.
GetType()
但是,使用比较类型很少是正确的解决方案 - 只有在您想要检查所涉及的确切类型而不是兼容类型时才适用.
关于其他地方的"演员与演唱"讨论,我写了一篇明显更长的答案.
完全没有 - 它让你有机会验证转换(强制转换)是否正常.如果你这样做
TreeViewItem i = (TreeViewItem) sender;
如果演员表失败,你可能会得到一个例外.
一般来说,这两个片段并不相同.TreeViewItem i = sender as TreeViewItem
将产生正确的结果,即使sender
是一个盛大隆重的孩子TreeViewItem
,而sender.GetType() == typeof(TreeViewItem)
将true
只当sender
是恰恰TreeViewItem
和其任何可能的子类.