我发现使用以下内容:
TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
比以下更容易编写和理解:
if(sender.GetType() == typeof(TreeViewItem)){
TreeViewItem i = (TreeViewItem)sender;
...
}
是否有令人信服的理由不使用第一个构造?
答案 0 :(得分:12)
在大多数情况下,我更喜欢强制转换为as
,因为通常如果对象的类型错误,则表示存在错误。错误应该导致异常IMO - 并且InvalidCastException
恰好在执行转换的行上比代码中的NullReferenceException
要清晰得多。
as
应该在有效且合法的情况下使用,以便传递对您不想要的类型的对象的引用。这种情况确实出现了,但并不像我的经验那样经常发生。
使用GetType()
比较类型很少是正确的解决方案 - 只有在您想要检查所涉及的精确类型而不是兼容类型时才适用。
我在其他地方写过关于“演员与作为”讨论的significantly longer answer。
答案 1 :(得分:7)
完全没有 - 它让您有机会验证转换(强制转换)是否已完成。如果你这样做
TreeViewItem i = (TreeViewItem) sender;
如果演员表失败,你可能会遇到异常。
答案 2 :(得分:6)
一般来说,这两个片段不等同于。即使TreeViewItem i = sender as TreeViewItem
是sender
的曾孙,而TreeViewItem
仅为sender.GetType() == typeof(TreeViewItem)
,<{1}}也会产生正确的结果em>当true
正好是sender
且没有可能的子类时。
答案 3 :(得分:4)
如果您真的想要手动比较类型的替代方法,请尝试:
if(person is Employee) { }
读得更好。
答案 4 :(得分:4)
你的例子最好写成:
if (sender is TreeViewItem) {
TreeViewItem i = (TreeViewItem)sender;
...
}
正是这种双重类型检查as
运算符可以帮助避免。因此,对于您引用的示例,我认为这绝对是一个很好的解决方案。
但是,有些情况下你真的做想要演员。如果您期望TreeViewItem
并且不想要任何其他内容,那么如果您获得了其他任何内容,则投射将确保投放InvalidCastException
。
就像在大多数情况下一样,这里没有一揽子规则:使用正确的工具来做正确的工作。
答案 5 :(得分:2)
如果你想要一个普通(不可空)的值类型,显然这不起作用,例如:
int test = sender as int;
无效,但是:
int? test = sender as int?;
是允许的。
答案 6 :(得分:1)
“as”更快,但要记住的事情是:
“as”返回null而不是抛出异常(如果这是一个问题)
它不会进行自定义转换iirc
它不适用于参考 - &gt;值
编辑:“as”肯定更快(http://www.codeproject.com/KB/cs/csharpcasts.aspx)
Edit2:基本上是速度与安全决策
答案 7 :(得分:1)
不,我用了很多。它允许您以干净的方式避免InvalidCastException
。
例如:
TreeViewItem tvItem = sender as TreeViewItem;
if (tvItem != null) return;
// Do stuff
而不是:
try
{
TreeViewItem tvItem = (TreeViewItem)sender;
// Do stuff.
}
catch (InvalidCastException ex)
{
// Didn't work, do something about it
return; // ... or not...
}
答案 8 :(得分:1)
如果获取错误的类型将是一个错误,那么你应该使用强制转换。原因是确实存在问题,你应该知道它。
如果该值可能为null,并且在发生这种情况时不是系统中的错误,则使用“as”。原因是你应该在任何时候使用“as”来获得空值。
请记住,您不能使用“as”转换为值类型,因为null值对于它们是不可接受的。如果您有值类型并且想要使用“as”,则需要使用可为空的值类型。