有没有令人信服的理由反对使用C#关键字"as"?

Mar*_*ter 7 .net c# types casting as-keyword

我发现使用以下内容:

TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
Run Code Online (Sandbox Code Playgroud)

比以下更容易编写和理解:

if(sender.GetType() == typeof(TreeViewItem)){
    TreeViewItem i = (TreeViewItem)sender;
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有令人信服的理由使用第一个结构?

Jon*_*eet 12

as在大多数情况下,我更喜欢强制转换,因为通常如果对象的类型错误,则表示存在错误.错误应该导致异常IMO - 并且InvalidCastException执行转换的行恰好比NullReferenceException代码中的更晚更清楚.

as应该在有效且合法的情况下使用,以便传递对您不想要的类型的对象的引用.确实出现了这种情况,但并不像我的经验那样经常进行.

GetType()但是,使用比较类型很少是正确的解决方案 - 只有在您想要检查所涉及的确切类型而不是兼容类型时才适用.

关于其他地方的"演员与演唱"讨论,我写了一篇明显更长的答案.


Otá*_*cio 7

完全没有 - 它让你有机会验证转换(强制转换)是否正常.如果你这样做

TreeViewItem i = (TreeViewItem) sender;
Run Code Online (Sandbox Code Playgroud)

如果演员表失败,你可能会得到一个例外.


Ant*_*lev 6

一般来说,这两个片段并不相同.TreeViewItem i = sender as TreeViewItem将产生正确的结果,即使sender是一个盛大隆重的孩子TreeViewItem,而sender.GetType() == typeof(TreeViewItem)true sender是恰恰TreeViewItem和其任何可能的子类.