这是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文档
答案 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。在功能上它也是如此,但微妙的差异往往会抛弃代码分析