为什么SonarQ说'使用'块没有处理?

时间:2014-03-20 16:59:17

标签: vb.net sonarqube

这是Sonar所说的:

  EnsureLocalDisposalRule      Open      Updated: 6 days      Technical debt: 1 hours   
  Local 'da' of type 'SqlDataAdapter' is not guaranteed to be disposed of. 

以下是代码:

    conn1.Open()
    Using da As New SqlDataAdapter(qry, conn1)
        'fill data set 1 for combobox
        da.Fill(ds1)
    End Using

    ds1.Dispose()

    With CompanyCbx
        'what the user sees
        .DisplayMember = "CMPNY_NM"
        'value behind each display member
        .ValueMember = "CMPNY_SEQ_ID"
        .DataSource = ds1.Tables(0)
        .SelectedIndex = 0
    End With
    'close connection
    conn1.Close()
    'Dispose connection
    conn1.Dispose()

有关Using块的文档说明它处理的是什么'使用,'所以我不明白错误。

这是Sonar的文档:

EnsureLocalDisposalRule

此规则检查在方法返回之前始终处置一次性本地人。使用'使用'语句(或try / finally块),即使在发生未处理的异常时也能保证本地处理。 链接官方Mono Gendarme文档

1 个答案:

答案 0 :(得分:2)

我猜这只是Sonar分析中的一个错误。对于逻辑上相同的using代码,C#和VB.Net生成稍微不同的IL,这种差异经常会抛弃反编译器。一般来说,它们都针对C#代码进行了调整,并且错过了VB.Net中的细微差别,因此认为它是手册try / finally而不是using

关键区别在于null中的VB.Net finally检查比C#更复杂。

C#

IL_000b: ldloc.0
IL_000c: ldnull
IL_000d: ceq
IL_000f: stloc.1
IL_0010: ldloc.1
IL_0011: brtrue.s IL_001a

VB.Net

IL_000c: ldloc.0
IL_000d: ldnull
IL_000e: ceq
IL_0010: ldc.i4.0
IL_0011: ceq
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: brfalse.s IL_001e

C#本质上取ceq的结果并对其进行分支,而VB.Net取结果,反转它然后分支为false。在功能上它也是如此,但微妙的差异往往会抛弃代码分析