5

如果我想缩小 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

4 回答 4

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的回答

于 2009-09-28T09:00:11.917 回答
2

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

MSDN 对变量的生命周期有这样的说法:

即使变量的范围仅限于块,它的生命周期仍然是整个过程的生命周期。如果在过程中多次输入块,则每个块变量都保留其先前的值。为了避免在这种情况下出现意外结果,明智的做法是在块的开头初始化块变量。

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

似乎只有在程序完成后变量才会进行垃圾收集,但即便如此,除非堆变得拥挤,否则垃圾收集器也不会运行。对于小型应用程序来说,最有可能的是在应用程序关闭之前不会收集垃圾。

于 2009-09-28T06:09:06.927 回答
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陈述,两者都不完全令人满意。

于 2009-09-28T06:08:53.493 回答
0

为什么不只创建几个方法?范围应该在方法中定义。退出该方法后,您将离开范围 - 干净且简单。你正在做的方式非常不正统 - 如果你担心范围蔓延(你所描述的),我建议你坚持约定并使用方法。

于 2012-04-09T19:32:47.590 回答