如果我要缩小在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
声明,这两者都不是完全令人满意。
为什么不只是创建了一些方法? 甲范围应的方法来定义。 一旦你退出的方法,你离开的范围 - 清洁容易。 你正在做的方式是非常非正统的 - 我建议你坚持公约和使用方法,如果你担心范围蔓延(你所描述)。