可能的重复:
C#“as”cast vs classic cast
这两种表达方式有什么区别?
(ListView)sender
sender as ListView
一般来说,我通常使用exp sender as ListView
。但在 SO 我发现大多数时候用户使用(ListView)sender
.
所以,我想知道哪个更有效。
或者,
如果是编码器的选择,使用哪一个[并且两者的工作方式相同]??
可能的重复:
C#“as”cast vs classic cast
这两种表达方式有什么区别?
(ListView)sender
sender 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永远不会抛出异常(如果不能分配给它,它会返回),但不会转换(例如你可以做但不是)并且如果不可为空则不会工作(例如你可以做但不是)。b
a
a
int
b as a
null
b
a
(int?)12.3
12.3 as int?
a
12 as int?
12 as int
sender as ListView
是相同的:
sender is ListView ? (ListView)sender : null
效率上几乎没有区别。as
对无效转换是安全的,因为它会产生 null 结果而不是抛出异常,所以我总是使用as
然后检查 null 条件。