为啥 FxCop 给我一个“DoNotCastUnnecessarily”警告?

Posted

技术标签:

【中文标题】为啥 FxCop 给我一个“DoNotCastUnnecessarily”警告?【英文标题】:Why is FxCop giving me a "DoNotCastUnnecessarily" warning?为什么 FxCop 给我一个“DoNotCastUnnecessarily”警告? 【发布时间】:2015-04-21 21:01:38 【问题描述】:

我有以下:

Option Strict On
Public NotInheritable Class Root
    Public Overrides Function Equals(obj As Object) As Boolean
        If TypeOf obj Is Root Then
            Dim rt As Root = DirectCast(obj, Root)
            Return rt.container.Equals(Me.container) AndAlso
                rt.question.Equals(Me.question)
        End If
        Return False
    End Function
End Class

FxCop 给了我这个警告:

Warning, Certainty 95, for DoNotCastUnnecessarily

    Target       : #Equals(System.Object)  (IntrospectionTargetMember)
    Location     : file:///C:/..../Root.vb<46>  (String)
    Resolution   : "'obj', a parameter, is cast to type 'Root' multiple 
                   times in method 'Root.Equals(Object)'. Cache the result 
                   of the 'as' operator or direct cast in order to eliminate 
                   the redundant castclass instruction."
    Help         : http://msdn2.microsoft.com/library/ms182271(VS.90).aspx  (String)
    Category     : Microsoft.Performance  (String)
    CheckId      : CA1800  (String)
    RuleFile     : Performance Rules  (String)
    Info         : "Avoid duplicate casts where possible, since there is 
                   a cost associated with them."
    Created      : 4/21/2015 8:45:17 PM  (DateTime)
    LastSeen     : 4/21/2015 8:55:16 PM  (DateTime)
    Status       : Active  (MessageStatus)
    Fix Category : NonBreaking  (FixCategories)

我做错了什么?我检查类型,如果相同则强制转换。

【问题讨论】:

【参考方案1】:

因为你可以将你的演员重写为

Dim rt As String = TryCast(obj, Root)
If Not (rt is Nohting) Then

这比 isDirectCast 的组合更高效

【讨论】:

【参考方案2】:

使用的语言似乎是为 C# 量身定制的,但它基本上是要求您使用 TryCast 而不是 Is

    Dim rt As Root = TryCast(obj, Root)
    If Not (rt Is Nothing) Then
        ' code
    End If

原因是无论如何这在内部执行相当于TryCast,所以工作量是重复的。

【讨论】:

以上是关于为啥 FxCop 给我一个“DoNotCastUnnecessarily”警告?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FxCop 坚持使用 IDisposable 作为结构

FxCop - CA1034 错误 - 为啥?

FxCop 自定义规则文档。为啥找不到我的网址?

为啥 FxCop 会在此 C# 代码中发出有关溢出 (CA2233) 的警告?

为啥我会收到来自 FxCop 的 InitializeReferenceTypeStaticFieldsInline 警告?

为啥 FxCop 将 GC.KeepAlive() 标记为违规?