与此问题类似,但对于VB.NET,因为我了解到这是一种语言问题.
例如,编译器是否知道要翻译
Dim s As String ="test"+"this"+"function"
至
Dim s As String = "test this function"
从而避免字符串连接的性能损失?
是.它确实.我只测试了VS 2008,但我强烈怀疑以前的版本也是如此.
VB.NET
Public Class Class1 Dim s As String = "test " + "this " + "function" Public Function test() As String Return s End Function End Class
IL - 注意字符串"test this function"
{ .maxstack 8 L_0000: ldarg.0 L_0001: call instance void [mscorlib]System.Object::.ctor() L_0006: nop L_0007: ldarg.0 L_0008: ldstr "test this function" L_000d: stfld string ClassLibrary1.Class1::s L_0012: nop L_0013: ret }
是的,它确实!让我们去测试.
由于.NET将所有托管语言(VB,C#,C++)编译为IL(中间语言)指令,并且String
类型是CLS(公共语言规范)的一部分,所有.NET Framework版本:String
2.0,3.0,3.5,4.0都将文字串联优化为编译过程的一部分.
例如下面的VB.NET代码:
Dim s As String = "A" & "B" & "C"
生成以下IL指令:
L_0008: ldstr "ABC"
这清楚地证明编译器正在优化String
文字串联(在ildasm.exe中测试)
但是,如果代码obove写在单独的语句中:
Dim s As String = "A" s &= "B" s &= "C"
没有进行优化,并且String
在运行时执行连接(性能开销).同样适用于在运行时解析数据的单行语句(变量,属性,方法).
使用下划线_将上述语句连接到单个语句中以强制优化:
Dim s As String = "A" _ & "B" _ & "C" _
如果你需要令牌之间的新行使用vbCrLf
(编译时)常量来确保优化,因为使用Environment.NewLine
(运行时)属性不提供优化.
希望这有助于您获得性能优势!