我使用Resharper
8,当我写
if (sender is Button)
Resharper
回复使用as
关键字并将其更改为:
Button button = sender as Button;
if (button != null)
有什么特别的原因吗?
正在使用as
真的比is
更好吗?或者在这种情况下as
更好?
答案 0 :(得分:4)
as
可以说是更好如果以后使用了结果表达式; is
即使没有,也是如此。 E.g。
if (sender is Button) {
Button button = (Button)sender; // just use `as`, as suggested
button.Push();
(我认为ReSharper只是在的情况下给出了一个警告/暗示可以消除重复的演员表,例如这个......)
话虽如此,我使用结构
Button button;
if ((button = sender as Button) != null) {
button.Push();
确保变量在条件中初始化(并且仅在条件中开始) - 这将as
的应用推迟到适当的条件表达式,并允许C#/ ReSharper检测一些不正确的[未初始化]变量用例
另见:
Casting vs using the 'as' keyword in the CLR - Jon的回答是“/(强制转换)”配对作为“不做”引起对共享和字段与属性访问的关注。表现和'''与'''差异也在讨论中。
还有一个重复的Which code is better: using "as" or "is"?,其中有一些更好的相关链接。
答案 1 :(得分:3)
我认为这是因为as
关键字同时执行,同时键入check和cast。因此,如果您以后使用发件人,则不必进行投射
答案 2 :(得分:3)
" as"运算符用于执行兼容类型之间的转换。而"是" operator用于检查对象的运行时类型是否与给定类型兼容。
所以我认为当as运算符尝试将对象强制转换为特定类型时,这是一个更好的选择,如果失败则返回null。
您还可以在 Is is as or is as is?
上查看 Eric Liperts 博客然而,在实践中,CLR为我们提供了指令isinst,其中 具有讽刺意味的是。因此我们有一个指令 实现了很好的语义,我们可以从中构建一个 实施是。简而言之,法律上是,并且按原样, 但事实上就是和isinst一样。
What's the difference between "as" and "cast" operators?
来自here:
' as'结束
对于is运算符,要键入强制转换,我们需要执行两个步骤:
- 使用
检查类型- 如果是,则输入
醇>实际上这会影响每次的性能 CLR将遍历继承层次结构,检查每个基类型 针对指定的类型。 要避免这种情况,请使用,因为它将在一个中执行 步骤。只有在检查类型时才应使用is运算符。
答案 3 :(得分:0)
您没有发布所有代码。我想在你的代码中,如果发送者是一个按钮,你将它转换为按钮并用它做一些事情。如果是这种情况,那么你在两次中完成了这项工作,一次是在语句块中的if和once中。 Resharper告诉你要做一次并完成它。