Объем и как сузить его с помощью VB.Net

Лучшее объяснение, которое я видел, находится в книге Paul Graham, На Lisp.

5
задан hitch 28 September 2009 в 06:02
поделиться

3 ответа

Интересно, что конвертер кода 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

как способ ограничения области действия. Я удивлен, что это беспокоит, учитывая ответ пейнтбола

6
ответ дан 14 December 2019 в 04:43
поделиться

похоже, нет хорошего способа создать новую область видимости в vb, но вы можете создать цикл, который гарантированно запускается только один раз, а затем объявить свою переменную внутри этого цикла.

В MSDN было сказано следующее о времени жизни переменной:

Даже если область действия переменной ограничена блоком, ее время жизни по-прежнему равно времени жизни всей процедуры. Если вы вводите блок более одного раза во время процедуры, каждая переменная блока сохраняет свое предыдущее значение. Чтобы избежать неожиданных результатов в таком случае, целесообразно инициализировать переменные блока в начале блока.

src: http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

кажется, что переменные подлежат сборке мусора только после завершения процедуры, но даже тогда сборщик мусора не будет работать, если куча не станет переполненной.

2
ответ дан 14 December 2019 в 04:43
поделиться

По крайней мере, в 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 , ни один из которых не является полностью удовлетворительным.

0
ответ дан 14 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: