0

当您 dispose() 一个变量时,是否应该立即在调试器 Locals 窗口中将其明显设置为“Nothing”?

当我在 Visual Studio 2010 调试器中单步执行此操作时,我可以在 Locals 窗口中看到 close() 调用确实将 r1 的 BaseStream 和各种其他成员设置为 Nothing,但 dispose() 调用不会将 r1 变量设置为整体到“无”。它仍然在 Locals 窗口中列为 {System.IO.StreamReader}。

Try
     r1 = New System.IO.StreamReader("c:\temp\dummy\dummy1.txt")
Finally
    If Not IsNothing(r1) Then
        r1.Close()
        r1.Dispose()
    End If
End Try

也许我的期望与它的实际工作方式不匹配。是否有明确的参考来解释这种行为?

编辑:是的,我已经知道 Using 语句,但是我需要分配两个 db 连接和两个 db 命令(每个打开的连接一个)。使用四深的语句嵌套似乎很复杂。此外,我想围绕每个 New Connection() 语句实现一个三击而你退出 while 循环,因为它们在我当前的环境中很容易失败,而我正在专门尝试解决这个问题。如果有人可以为我指出一个有用的结构来混合 While 和 Usings,他们会获得当天的金星。

4

2 回答 2

2

Dispose是一种与其他任何方法一样的方法,它不会将变量设置为Nothing(或null在 C# 中)

Dispose方法的目的是“[执行]与释放、释放或重置非托管资源相关的应用程序定义任务”。(来源

正因为如此,一个对象在被释放后通常是不可用的,但分配给它的变量保持不变,直到您自己明确地重新分配它。

话虽如此,您通常应该using对一次性物品使用声明。

Using r1 As New System.IO.StreamReader("c:\temp\dummy\dummy1.txt")
   'Code goes here
End Using
于 2014-08-07T17:23:13.857 回答
1

当一个变量被释放时,它所标识的对象通常会变得无用,但该对象仍然存在,并且该变量将继续标识现在无用的对象,直到该变量被其他东西覆盖或停止存在。.NET 中的一条绝对不能违反的规则是,只要对它的任何可访问引用存在,每个对象就必须继续存在。系统有一种方法可以检查存在的每个引用,并使那些目标由弱引用标识的弱引用无效,但是系统无法找到所有可能存在于无用对象的“正常”引用并使之无效他们。因此,之前识别对象的任何引用Dispose被调用后它将继续这样做,除非它们被Dispose方法本身中的实际代码显式覆盖。

于 2014-08-07T18:19:59.663 回答