2011-08-09 42 views
5

最近,我试图做的在C#System.String底层实现

string str = "u r awesome"; 
str[0]="i"; 

下,它不会工作,因为显然STR [1]仅仅是一个没有得到一组,所以我想知道什么字符串的底层实现是强制str [i]仅仅是一个get。

是不是它只是一个char *的托管包装?那么为什么我不能设置str [i]?

回答

3

的其他人,放弃关于永恒的答案是正确的路线和是你遇到的问题的“实际”的原因。

既然你特别问了一下底层实现(如果只是出于好奇),并为其他人在这个问题可能绊倒一个参考,这里是从Eric Lippert关于该主题的更多信息:

“在.NET CLR中,字符串在内存中的布局与在OLE自动化中实现BSTR的方式几乎相同:作为字对齐的 由四字节整数组成的内存缓冲区,其长度为 字符串,然后是UTF-16数据的两个字节的 块中字符串的字符,后跟两个零字节。“

请注意这里的“非常多”部分,但BSTR本身也在Eric's blog中进行了说明。

请注意,所有这些都应视为实施细节。尽管它不应该真正关注我们大多数人,但它在调试互操作问题或一般理解时可能会有所帮助。

+0

这实际上是我正在寻找的答案,具体是关于如何实现字符串,谢谢! – etk1220

8

由于.NET String类是不可变 - 您的内容在创建后无法更改,因此无法设置字符串的字符。这允许相同的字符串实例被安全地多次使用,而没有一个对象担心另一个对象将踩下它的字符串。

如果您需要可让您操作字符串的可变类,请考虑使用StringBuilder代替。

如果要与C进行比较,String类型与const char *类似,只是不能丢弃常量。 StringBuilder更像是一个char *(具有自动分配大小调整)和一个方法(ToString())从其内容创建新的独立String实例。

+0

相关:StringBuilder内部细节http://stackoverflow.com/q/3564906/38206 –

2

像由cdhowie回答,这是不一样的在C柱的概念/ C++

如果你想在上面,作为一个建议,你可以尝试通过集装箱来模拟实现,如下面

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

为此,使用StringBuilder会更好,因为它的具体目的是允许构建字符串。 – cdhowie

+1

完全同意。代码建议实际上只是试图展示如果他真的想要通过索引来操作元素,如何在另一个实现上使用etk。 –

+3

'StringBuilder'有一个[索引器](http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx),它可以完全实现这一点。 :) – cdhowie