代码之家  ›  专栏  ›  技术社区  ›  amonroejj

.Net:当您处置()变量时,是否应该立即在调试器Locals窗口中将其设置为“Nothing”?

  •  0
  • amonroejj  · 技术社区  · 10 年前

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

    当我在Visual Studio 2010调试器中单步执行此操作时,我可以在Locals窗口中看到close()调用确实将r1的BaseStream和其他各种成员设置为Nothing,但dispose()调用并未将r1变量整体设置为“Nothing”。它仍然在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命令(每个打开的连接一个)。使用四个深度的语句嵌套似乎令人费解。此外,我还想实现一个三击,你可以在循环每个NewConnection()语句时退出,因为它们在我当前的环境中很容易失败,我正专门尝试解决这个问题。如果有人能给我指出一个有用的结构来混合辉格党和乌辛斯党,他们今天会得到一颗金星。

    2 回复  |  直到 10 年前
        1
  •  2
  •   dee-see Tom Ritsema    10 年前

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

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

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

    话虽如此,您通常应该使用 using 语句。

    Using r1 As New System.IO.StreamReader("c:\temp\dummy\dummy1.txt")
       'Code goes here
    End Using
    
        2
  •  1
  •   supercat    10 年前

    当一个变量被释放时,它所标识的对象通常会变得无用,但该对象仍然存在,并且该变量将继续标识现在无用的对象,直到该变量被其他对象覆盖或不再存在。一个绝对不能违反.NET中的ever规则,即每个对象都必须继续 存在 只要存在对它的任何可访问引用。该系统具有检查每个 虚弱的 存在引用,并使目标已确定的引用无效 只有 通过弱引用,但系统无法找到可能存在于无用对象的所有“正常”引用并使其无效。因此,之前标识对象的任何引用 Dispose 它将在以后继续这样做,除非它们被 处置 方法本身。