我目前正在阅读Jon Skeet的深度C#,并一直在阅读有关价值和参考类型的信息。
这让我想到了使用值类型作为方法参数的成本,因为传递时会复制该值。虽然这个成本在考虑整数时并不多,但如果这些值参数是多次传递的字符串会怎么样。
使用StringBuilder类并传递它而不是字符串类型会有好处吗?
如果您认为字符串很长,比如说1024个字符,并且在方法之间传递了几次,那么与具有相同值的StringBuilder形成对比,最终会将引用的值传递为4或每次8个字节,你可以在改进中有相当的表现。
这个问题也可能突出了我对String类型可能缺少的一个重要理解,随时可以在必要时指出这一点。
此外,这会对每个实例中的字符串的垃圾收集产生什么影响?
编辑:显然我忘记了一条关于字符串的重要信息,这些信息使得问题无效。谢谢grover。
答案 0 :(得分:8)
String不是值类型,它们只是不可变对象。
传递一个字符串会产生与任何其他对象相同的开销:它的引用大小,在Win32上是4个字节。
另外需要注意:值类型语义(通过值传递)可以由编译器以优化的方式实现。我没有看过MS JIT是如何做到的,但它当然仍然只能发送一个指向它的指针,并要求目标在写入时复制。
我们将在Managed Operating System Alliance JIT / AOT编译器中执行此操作。