对为什么字符串不可变的答案感到困惑

时间:2016-07-29 03:05:27

标签: c#

寻找Why .NET String is immutable?

的某些要点的澄清

面试问题:为什么字符串不可变

我的回答:所以他们可以更像对象然后是字符数组(错误的我应该有所说的值类型),但即便如此也是部分答案。见上面的链接

采访者:它阻止他们填满googlygoop并返回垃圾加上它可以提高性能。

现在,他解释googlygoop的方式使得它看起来像是在谈论某种字符串元数据而且对象(跟踪此元数据的可变字符串会损害性能。 现在让我困惑的是:

  1. 更改可变字符串的部分将返回垃圾。 Stringbuilders是可变的,我们改变它们并且永远不会得到垃圾,除非我们把垃圾放进去。他可能指的是通过引用传递给函数并且可能返回意外的结果。还有其他方法可以理解吗?

  2. 我认为stringbuilders是性能改进的,因为我们并没有摧毁它们并且每次改变都会重建它们,这反过来会减少对gc的工作量。

  3. 此外,我对堆栈溢出答案感到有点困惑:

      

    还可以节省内存优化。实习和雾化   作为最明显的例子,虽然我们可以做其他版本的   同样的原则。我曾经节省了大约半GB的内存   通过比较不可变对象和替换对重复项的引用   所以他们都指向同一个实例(耗费时间,但是a   分钟的额外启动以节省大量内存是一个   在有问题的情况下表现胜利)。用可变对象   无法完成。

    从那以后,这对我来说似乎是倒退了:

    A)如果我宣布

    string x = "test";
    string y = x;
    

    我正在制作x的副本并将其存储在y中。因此,我基本上只是将我使用的内存加倍,而如果y指向x的内存位置,我只是使用内存创建指向“测试”的指针而不是整个字符串。 因此,我认为上述有意义的唯一方法是,如果我做了类似

    的事情
    string x = "1"
    string y = "2"
    
    if dbValue["col'] == x then 
       treenode[i].text = x
    else
       treenode[i].text = y
    

    但这并没有多大意义,因为treenode [i] .text仍然只是x的副本而不是指向x在内存中的位置。但是,如果可变对象是引用类型,我们可以在内存中创建对相同字符串的引用,并保存在内存中。

    事实上,我没有看到op如何使用不可变字符串来保存半GB。

    更新

    我发现他所引用的字符串元数据可能会影响性能,例如必须复制字符串[i] = string2 [i]为1000个字符加上必须跟踪数组上的信息(索引,计数等)会影响表现。它可能吗?

    我认为我只是不理解某些东西,所以我错过了什么?

0 个答案:

没有答案