[英]Scope and how to narrow it using VB.Net
如果我想在C#中縮小變量的范圍,我可以引入額外的括號 - 即:
class Program
{
static void Main(string[] args)
{
myClass x = new myClass();
x.MyProperty = 1000;
Console.WriteLine("x = " + x.MyProperty);
{
myClass y = new myClass();
y.MyProperty = 2000;
Console.WriteLine("y = " + y.MyProperty);
}
myClass y2 = new myClass();
y2.MyProperty = 3000;
Console.WriteLine("y2 = " + y2.MyProperty);
}
class myClass
{
public int MyProperty { get; set; }
}
}
在ide中,我不能再在新大括號引入的范圍之外引用y。 我原以為這意味着變量y可用於垃圾收集。
(有趣的是,當使用反射器查看編譯后的代碼時,無論是否有額外的大括號,都沒有區別)
使用VB.net時是否有類似的方法縮小范圍? 這對內部作用域中定義的變量何時可能被垃圾收集有影響嗎?
有趣的是,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
作為限制范圍的一種方式。 我很驚訝它記住了paintballbob的答案
似乎沒有一種在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");
(就術語而言,變量本身並未被收集,只是當它被視為垃圾收集器的“根”時,它會阻止它所引用的對象被收集。)
當您連接了調試器時,GC更加保守,因為您可能希望在其最后一個“正常”讀取點之后檢查變量的值。
減少范圍界定的主要好處是清晰度,IMO。 如果變量具有較窄的范圍,那么當您不查看該位代碼時(假設代理不會捕獲它等),您可以忘記它。
我不知道除了作用域之外,VB是否有任何等價的語句塊; 最近的等價物可能是一個With
語句......或者一個Do
... Loop While False
語句,兩者都不完全令人滿意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.