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

时间:2009-02-20 13:12:33

标签: c# .net casting types as-keyword

我发现使用以下内容:

TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }

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

if(sender.GetType() == typeof(TreeViewItem)){
    TreeViewItem i = (TreeViewItem)sender;
    ...
}

是否有令人信服的理由使用第一个构造?

9 个答案:

答案 0 :(得分:12)

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

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

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

我在其他地方写过关于“演员与作为”讨论的significantly longer answer

答案 1 :(得分:7)

完全没有 - 它让您有机会验证转换(强制转换)是否已完成。如果你这样做

TreeViewItem i = (TreeViewItem) sender;

如果演员表失败,你可能会遇到异常。

答案 2 :(得分:6)

一般来说,这两个片段不等同于。即使TreeViewItem i = sender as TreeViewItemsender的曾孙,而TreeViewItem仅为sender.GetType() == typeof(TreeViewItem) ,<{1}}也会产生正确的结果em>当true正好是sender且没有可能的子类时。

答案 3 :(得分:4)

“as”:好东西。一直使用它。

如果您真的想要手动比较类型的替代方法,请尝试:

  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”,则需要使用可为空的值类型。

When to Use "as" Versus Casting