可能的重复:
C#“as”cast vs classic cast
这两种表达方式有什么区别?
(ListView)sendersender as ListView
一般来说,我通常使用exp sender as ListView。但在 SO 我发现大多数时候用户使用(ListView)sender.
所以,我想知道哪个更有效。
或者,
如果是编码器的选择,使用哪一个[并且两者的工作方式相同]??
可能的重复:
C#“as”cast vs classic cast
这两种表达方式有什么区别?
(ListView)sendersender as ListView一般来说,我通常使用exp sender as ListView。但在 SO 我发现大多数时候用户使用(ListView)sender.
所以,我想知道哪个更有效。
或者,
如果是编码器的选择,使用哪一个[并且两者的工作方式相同]??
不同之处在于,如果 sender 不是 ListView,则 (ListView)sender 会抛出异常,但作为 ListView 的 sender 不会抛出异常,而是在强制转换无效时返回 null。
不同之处在于,如果由于某种原因 sender 无法转换为 ListView,(ListView)sender则会引发异常,而sender as ListView会导致结果为空。
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
as运算符在失败时不会抛出异常,而是用 null 填充 Left-Hand-Side 变量。
(ListView)sender如果发件人不是 ListView,While会抛出异常。
如果不能赋值或不能转换,using(a)b将抛出异常,即使是不可为空的类型(如)也可以使用。Using永远不会抛出异常(如果不能分配给它,它会返回),但不会转换(例如你可以做但不是)并且如果不可为空则不会工作(例如你可以做但不是)。baaintb as anullba(int?)12.312.3 as int?a12 as int?12 as int
sender as ListView是相同的:
sender is ListView ? (ListView)sender : null
效率上几乎没有区别。as对无效转换是安全的,因为它会产生 null 结果而不是抛出异常,所以我总是使用as然后检查 null 条件。