范围以及如何使用VB.Net缩小范围

时间:2009-09-28 06:02:17

标签: c# vb.net scope reflector

如果我想缩小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时是否有类似的方法缩小范围?这对内部作用域中定义的变量何时可能被垃圾收集有影响吗?

4 个答案:

答案 0 :(得分:6)

有趣的是,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's answer

答案 1 :(得分:2)

似乎没有一种在vb中创建新作用域的好方法,但是你可以创建一个只运行一次的循环,然后在该循​​环中声明你的变量。

MSDN对变量的生命周期进行了说明:

  

即使变量的范围仅限于块,其寿命仍然是整个过程的寿命。如果在过程中多次输入块,则每个块变量将保留其先前的值。为避免在这种情况下出现意外结果,最好在块的开头初始化块变量。

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

似乎变量只在程序完成后才进行垃圾收集,但即使这样,垃圾收集器也不会运行,除非堆变得拥挤。最有可能的小应用程序在应用程序关闭之前不会收集任何垃圾。

答案 2 :(得分:0)

至少在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声明,两者都不完全令人满意。

答案 3 :(得分:0)

为什么不创建一些方法呢?范围应该在方法中定义。退出方法后,您将离开示波器 - 干净简单。你正在做的事情是非常不正统的 - 如果你担心范围蔓延(你所描述的),我建议你坚持使用约定和使用方法。