当前位置:  开发笔记 > 编程语言 > 正文

字符串不变性

如何解决《字符串不变性》经验,为你挑选了1个好方法。

字符串不变性是通过语句还是通过语句中的字符串来工作的?

例如,我了解以下代码将在堆上分配两个字符串.

string s = "hello ";
s += "world!";

"你好"将留在堆上,直到垃圾收集; 现在引用"你好世界!" 在堆上.但是,以下行在堆上分配了多少个字符串... 1或2?此外,是否有工具/方法来验证结果?

string s = "goodbye " + "cruel world!";

Marc Gravell.. 21

编译器对字符串连接有特殊处理,这就是为什么第二个例子只有一个字符串.而"实习"意味着即使你运行这条线20000次,仍然只有1个字符串.

重新测试结果......最简单的方法(在这种情况下)可能是看反射器:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

正如您所见(ldstr),编译器已经为您完成了此操作.



1> Marc Gravell..:

编译器对字符串连接有特殊处理,这就是为什么第二个例子只有一个字符串.而"实习"意味着即使你运行这条线20000次,仍然只有1个字符串.

重新测试结果......最简单的方法(在这种情况下)可能是看反射器:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] string s)
    L_0000: ldstr "goodbye cruel world!"
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: call void [mscorlib]System.Console::WriteLine(string)
    L_000c: ret 
}

正如您所见(ldstr),编译器已经为您完成了此操作.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有