我读过一些有关String.Empty与“”的文章,我也自己进行测试。它们之间的区别如下。

空字符串

L_0001: ldsfld string [mscorlib]System.String::Empty


L_0001: ldstr ""

在与 friend 交谈之后,他们争辩说String.Empty比“”更快,因为在底层(在组装级别),ldstr比ldsfld多做1个圆。 (我不记得使它们与众不同的步骤)

我想知道如何检查性能的这一方面。

最佳答案

ldsfld操作将静态字段的值压入评估堆栈,而ldstr操作将对元数据字符串文字的引用压入。
性能差异(如果有)将是最小的。较新版本的编译器实际上是用""代替String.Empty
您还应该考虑代码的可读性和可维护性。使用String.Empty可以更清楚地知道您实际上是一个空字符串,而不仅仅是忘记在字符串文字中键入内容。
编辑:
我看了看创建的 native 代码。
C#3, Release模式,x86:

        string a = String.Empty;
0000002a  mov         eax,dword ptr ds:[0356102Ch]
0000002f  mov         dword ptr [ebp-8],eax
        string b = "";
00000032  mov         eax,dword ptr ds:[0356202Ch]
00000038  mov         dword ptr [ebp-0Ch],eax
C#3, Release模式,x64:
        string a = String.Empty;
0000003b  mov         rax,12711050h
00000045  mov         rax,qword ptr [rax]
00000048  mov         qword ptr [rsp+28h],rax
        string b = "";
0000004d  mov         rax,12713048h
00000057  mov         rax,qword ptr [rax]
0000005a  mov         qword ptr [rsp+30h],rax
因此,最终代码是相同的。

关于.net - IL中的ldsfld和ldstr有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3674288/

10-13 01:25