在工作中,我经常在一些项目中工作,这些项目必须在建造期间或生命早期设置某些物体的许多属性.为了方便和可读性,我经常使用该With语句来设置这些属性.我发现
With Me.Elements
.PropertyA = True
.PropertyB = "Inactive"
' And so on for several more lines
End With
Run Code Online (Sandbox Code Playgroud)
看起来好多了
Me.Elements.PropertyA = True
Me.Elements.PropertyB = "Inactive"
' And so on for several more lines
Run Code Online (Sandbox Code Playgroud)
对于只设置属性的很长的语句.
我注意到With在调试时使用时存在一些问题; 但是,我想知道是否有任何令人信服的理由避免With在实践中使用?我总是假设通过编译器为上述两种情况生成的代码基本相同,这就是为什么我总是选择写出我觉得更具可读性的原因.
在C#我可以这样做:
new SomeObjectType("abc", 10);
Run Code Online (Sandbox Code Playgroud)
换句话说,我可以调用 new 而无需将创建的实例分配给任何变量。然而,VB.Net我似乎不能做同样的事情。
New SomeObjectType("abc", 10) ' syntax error
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点VB.Net?
所以我正在玩ILDASM,并注意到一个奇怪的是我在Google上找不到一个非常好的解释.
似乎在VB.NET中使用With块时,得到的MSIL大于w/o.所以这让我想问,With Blocks真的更有效吗?MSIL是JIT到本机机器代码的东西,所以较小的代码大小应该意味着更高效的代码,对吧?
这是两个类(Class2和Class3)的示例,它们为Class1的实例设置相同的值.Class2没有With块,而Class3使用With.Class1有六个属性,涉及6个私有成员.每个成员都是特定的数据类型,它都是此测试用例的一部分.
Friend Class Class2
Friend Sub New()
Dim c1 As New Class1
c1.One = "foobar"
c1.Two = 23009
c1.Three = 3987231665
c1.Four = 2874090071765301873
c1.Five = 3.1415973801462975
c1.Six = "a"c
End Sub
End Class
Friend Class Class3
Friend Sub New()
Dim c1 As New Class1
With c1
.One = "foobar"
.Two = 23009
.Three = 3987231665
.Four = 2874090071765301873
.Five = 3.1415973801462975
.Six = "a"c
End With
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
这是Class2的结果MSIL:
.method assembly specialname rtspecialname
instance …Run Code Online (Sandbox Code Playgroud)