如果我想缩小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时是否有类似的方法缩小范围?这对内部作用域中定义的变量何时可能被垃圾收集有影响吗?
答案 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)
为什么不创建一些方法呢?范围应该在方法中定义。退出方法后,您将离开示波器 - 干净简单。你正在做的事情是非常不正统的 - 如果你担心范围蔓延(你所描述的),我建议你坚持使用约定和使用方法。