C# &引用;(列表视图)发送者“;对;“发件人作为列表视图”;

C# &引用;(列表视图)发送者“;对;“发件人作为列表视图”;,c#,casting,sender,C#,Casting,Sender,可能重复: 这两种表达方式有什么区别 (列表视图)发件人 sender as ListView 通常,我使用exp发送方作为ListView。 但在SO中,我发现大多数用户使用(ListView)sender 所以,我想知道哪一个更有效 或者 如果是编码器的选择,使用哪一个[并且两者的工作方式相同]?as运算符在失败时不会引发异常,而是用null填充左侧变量 而(ListView)发送方将在发送方不是ListView时引发异常 as运算符失败时不会引发异常,而是用null填充左侧变量 而(

可能重复:

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

  • (列表视图)发件人
  • sender as ListView
通常,我使用exp
发送方作为ListView
。 但在SO中,我发现大多数用户使用
(ListView)sender

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

或者


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

as
运算符在失败时不会引发异常,而是用null填充左侧变量


(ListView)发送方
将在发送方不是ListView时引发异常

as
运算符失败时不会引发异常,而是用null填充左侧变量

(ListView)发送方
将在发送方不是ListView时引发异常

区别在于 (ListView)如果发送方不是ListView,发送方将抛出异常,但作为ListView的发送方不会抛出异常,如果强制转换无效,则返回null。

区别在于
(ListView)如果发送方不是ListView,则发送方将引发异常,但作为ListView的发送方不会引发异常,如果强制转换无效,则返回null。

不同之处在于,如果出于某种原因,发送方不能强制转换为ListView,
(ListView)发送方将引发异常,而
发送方作为列表视图
将导致结果为空。

区别在于,如果由于某种原因发送方不能强制转换到列表视图,
(列表视图)发送方
将引发异常,而
发送方作为列表视图
将导致结果为空

var listview = (ListView)sender  // Throws an exception if sender is not listView


如果
b
不可分配给
a
或无法转换,则使用
(a)b
将引发异常,即使
a
是不可为空的类型(如
int
),也可以使用该异常。使用
b作为
将永远不会引发异常(如果
b
无法分配给
a
,则返回
null
),但不会转换(例如,您可以执行
(int?)12.3
,但不能将
12.3作为int?
),并且如果
a
不可为null,则不会工作(例如,您可以将
12作为int?
而不是
12作为int
)。

使用
(a)如果
b
不可分配给
a
或无法转换,则b
将抛出异常,即使
a
是不可为空的类型(如
int
)也可以使用。使用
b作为
将永远不会引发异常(如果
b
无法分配给
a
,则返回
null
),但不会转换(例如,您可以执行
(int?)12.3
,但不执行
12.3作为int?
),并且如果
a
不可为null,则不会工作(例如,您可以将
12作为int?
执行,但不能将
12作为int
)。

发送者作为列表视图
与:

sender is ListView ? (ListView)sender : null

效率几乎没有差别。
as
对无效强制转换是安全的,因为它会生成一个空结果,而不是引发异常,所以我总是使用
as
,然后检查空条件。

发送者as ListView
与以下内容相同:

sender is ListView ? (ListView)sender : null

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

我认为这样做的缺点是is也会执行一个强制转换,这将导致双重错误cast@TGH
是< /COD>执行运行时检查,看看它是否可以完成引用转换而不引起异常。它实际上不执行转换。CLR中有很多这样的检查,因为它是托管环境,所以我不会担心优化它,或者认为它是一个缺点。<代码> AS /代码>产生更清洁、更安全的CO。在大多数情况下都是de(事实上,我不知道在任何情况下,当我可以使用
as
)时,我会选择直接强制转换。@ErenErsönmez当我希望在那些“不幸的情况”中引发异常时,我会选择直接强制转换。理解无效强制转换异常比理解稍后某个地方发生的空引用异常更容易…如果它将失败,请快速失败。@pst如果我理解正确,您可以在知道直接强制转换应该工作的情况下使用它——如果它不工作,则它是一个bug,您希望在测试中尽早发现。这是合理的我认为这样做的缺点是,is也会做一个演员阵容,这将导致一个双重角色cast@TGH
is
执行运行时检查,以查看它是否可以在不引起异常的情况下完成引用转换。它实际上不执行转换。CLR中有许多这样的检查,因为它是托管环境,所以我不会担心对它进行优化,或者认为它是一个缺点。<代码> AS <代码>在大多数情况下产生更干净和更安全的代码(实际上,我不知道在使用“<代码> > <代码> >的情况下,我会选择使用直接CAST。”“不幸的情况"。理解无效强制转换异常比理解稍后某个地方发生的空引用异常更容易…如果它将失败,请快速失败。@pst如果我理解正确,您可以在知道直接强制转换应该工作的情况下使用它——如果它不工作,则它是一个bug,您希望在测试中尽早发现。这是合理的e选择。