VB.NET是怎样做到的(十)——With语句
最近看到有人提到了VB特有的With语句,于是我就来研究一下。With语句是VB从Pascal中借鉴的语法,其作用就是多次使用同一个变量的成员。如下面对按钮的操作:
Button1.Text = "Button1"
Button1.Left = 100
Button1.ForeColor = Color.Blue
就可以简化为
With Button1
.Text = "Button1"
.Left = 100
.ForeColor = Color.Blue
End With
在早期的VB中,With语句就说比逐一使用其成员性能更好。那么在.NET中是不是也是这样?通过研究发现,With语句总是增加一个临时变量。比如上面那个例子中的With语句,就会产生如下效果:
Dim TempButton As Button
TempButton = Button1
TempButton.Text = "Button1"
TempButton.Left = 100
TempButton.ForeColor = Color.Blue
这说明,With语句用于大部分变量的时候不但没有增加性能,反而多增加了一个变量引用。因此,对于局部变量和类的普通字段,使用With是没有必要的。我记得网上有人提到过这个问题,还以次证明VB产生的代码效率不高。但是,这么说太绝对了,如果With语句应用在用窗体设计器添加的控件上,就会有效率的提升。为什么这么说呢?我在以前的《VB.NET是怎样做到的》讲解WithEvents原理的时候说过,由WithEvents定义的变量,其实质是一个属性,里面包含了对控件事件映射的代码。因此,若Button1那个变量是由窗体设计器生成的,包含WithEvents的变量,那么实际上需要通过窗体的属性来访问,就是说Button1.Text = “A”将被翻译成Me.get_Button1().set_Text(“A”)若对Button1的大量属性做这种操作,开销就比较大了。这时,如果用With语句,VB就会自动生成一个局部变量来接受Me.get_Button1()的结果,然后对其属性进行修改的语句全部都在这个局部变量上进行,需要修改的属性越多,这种修改的好处就越明显。
因此,我们得出的结论是,With语句通常不能增加效率,但是,在需要修改由窗体设计器生成的,带有WithEvents定义的控件的大量属性时,采用With可以获得性能收益。

浙公网安备 33010602011771号