.Net: Когда вы утилизируете переменную (), должна ли она сразу же визуально быть установлена ​​на "Ничего" в окне Locals отладчика?

Когда вы утилизируете () переменную, должна ли она немедленно, визуально быть установлена ​​на "Ничего" в окне Locals отладчика?

Когда я выполняю этот шаг в отладчике Visual Studio 2010, я вижу в окне Locals, что вызов close() устанавливает BaseStream r1 и различных других членов в 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, но мне нужно выделить два соединения дб и две команды дб (по одной для каждого из открытых соединений). Гнездование с использованием утверждений в четыре глубины казалось запутанным. Кроме того, я хотел реализовать цикл "три удара и ты вне" вокруг каждого из операторов New Connection(), потому что они склонны к сбою в моей текущей среде, и я специально пытаюсь устранить это. Если кто-то может указать мне на полезную структуру для смешивания Whiles и Usings, они получат золотую звезду на весь день.

2 ответа

Решение

Dispose это метод, как и любой другой, и он не устанавливает переменную в Nothing (или же null в C#)

Цель Dispose Метод заключается в том, чтобы "[выполнять] определенные приложением задачи, связанные с освобождением, освобождением или сбросом неуправляемых ресурсов". ( источник)

Из-за этого объект часто становится непригодным для использования после его удаления, но переменная, которой он назначен, остается неизменной до тех пор, пока вы сами не назначите его явно.

При этом, как правило, вы должны использовать using выписка по одноразовым предметам.

Using r1 As New System.IO.StreamReader("c:\temp\dummy\dummy1.txt")
   'Code goes here
End Using

Когда переменная удаляется, объект, который она идентифицирует, часто становится бесполезным, но объект все еще существует, и переменная будет продолжать идентифицировать бесполезный теперь объект до тех пор, пока либо переменная не будет перезаписана чем-то другим, либо перестанет существует. Одно абсолютное правило, которое нельзя "никогда не нарушать" в.NET, заключается в том, что каждый объект должен продолжать существовать до тех пор, пока существует любая доступная ссылка на него. В системе есть средства для изучения каждой существующей слабой ссылки и аннулирования тех, чья цель идентифицируется только слабыми ссылками, но нет никаких средств, с помощью которых система могла бы найти все "нормальные" ссылки, которые могут существовать, для бесполезного объекта и сделать недействительной их. Таким образом, любые ссылки, которые идентифицировали объект раньше Dispose был вызван, он будет продолжать делать это позже, если они не будут явно перезаписаны фактическим кодом внутри Dispose сам метод.

Другие вопросы по тегам