1

可能的重复:
C#“as”cast vs classic cast

这两种表达方式有什么区别?

  • (ListView)sender
  • sender as ListView

一般来说,我通常使用exp sender as ListView。但在 SO 我发现大多数时候用户使用(ListView)sender.

所以,我想知道哪个更有效。

或者,

如果是编码器的选择,使用哪一个[并且两者的工作方式相同]??

4

6 回答 6

11

不同之处在于,如果 sender 不是 ListView,则 (ListView)sender 会抛出异常,但作为 ListView 的 sender 不会抛出异常,而是在强制转换无效时返回 null。

于 2012-05-23T04:57:50.547 回答
5

不同之处在于,如果由于某种原因 sender 无法转换为 ListView,(ListView)sender则会引发异常,而sender as ListView会导致结果为空。

于 2012-05-23T04:58:03.200 回答
2
var listview = (ListView)sender  // Throws an exception if sender is not listView

var listview = sender as ListView  // listview will be assigned to null if sender is not
                                   // a listview
于 2012-05-23T05:01:40.993 回答
0

as运算符在失败时不会抛出异常,而是用 null 填充 Left-Hand-Side 变量。

(ListView)sender如果发件人不是 ListView,While会抛出异常。

于 2012-05-23T04:55:59.467 回答
0

如果不能赋值或不能转换,using(a)b将抛出异常,即使是不可为空的类型(如)也可以使用。Using永远不会抛出异常(如果不能分配给它,它会返回),但不会转换(例如你可以做但不是)并且如果不可为空则不会工作(例如你可以做但不是)。baaintb as anullba(int?)12.312.3 as int?a12 as int?12 as int

于 2012-05-23T05:04:04.897 回答
0

sender as ListView是相同的:

sender is ListView ? (ListView)sender : null

效率上几乎没有区别。as对无效转换是安全的,因为它会产生 null 结果而不是抛出异常,所以我总是使用as然后检查 null 条件。

于 2012-05-23T05:26:03.623 回答