Лучшее объяснение, которое я видел, находится в книге Paul Graham, На Lisp.
Интересно, что конвертер кода developerFusion c # -vb.net преобразует
{
myClass y = new myClass();
y.MyProperty = 2000;
Console.WriteLine("y = " + y.MyProperty);
}
в
If True Then
Dim y As New [myClass]()
y.MyProperty = 2000
Console.WriteLine("y = " & y.MyProperty)
End If
как способ ограничения области действия. Я удивлен, что это беспокоит, учитывая ответ пейнтбола
похоже, нет хорошего способа создать новую область видимости в vb, но вы можете создать цикл, который гарантированно запускается только один раз, а затем объявить свою переменную внутри этого цикла.
В MSDN было сказано следующее о времени жизни переменной:
Даже если область действия переменной ограничена блоком, ее время жизни по-прежнему равно времени жизни всей процедуры. Если вы вводите блок более одного раза во время процедуры, каждая переменная блока сохраняет свое предыдущее значение. Чтобы избежать неожиданных результатов в таком случае, целесообразно инициализировать переменные блока в начале блока.
src: http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx
кажется, что переменные подлежат сборке мусора только после завершения процедуры, но даже тогда сборщик мусора не будет работать, если куча не станет переполненной.
По крайней мере, в C # сборка мусора не влияет на сборку мусора, когда отладчик не прикреплен - GC может работать, когда переменная читается в последний раз, и переменная не считается корнем GC после этого момента. Например:
object y = new object();
Console.WriteLine("y is still a GC root");
Console.WriteLine(y);
Console.WriteLine("y is not a GC root now");
y = null;
Console.WriteLine("y is still not a GC root");
(С точки зрения терминологии, сама переменная не собирается, просто, хотя она считается «корнем» сборщика мусора, она предотвращает сбор объекта, на который она ссылается.)
Когда к вам подключен отладчик, сборщик мусора гораздо более консервативен, так как вы можете захотеть проверить значение переменной после ее последней "нормальной" точки чтения.
Основным преимуществом уменьшения объема работ является ясность, ИМО. Если переменная имеет узкую область видимости, вы можете забыть об этом, когда не смотрите на этот фрагмент кода (при условии, что он не захвачен делегатом и т. Д.).
Я не знаю, есть ли в VB какой-либо эквивалент блокировка операторов без каких-либо причин, кроме области видимости; ближайшим эквивалентом может быть оператор With
... или оператор Do
... Loop While False
, ни один из которых не является полностью удовлетворительным.