簡體   English   中英

范圍以及如何使用VB.Net縮小范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM