最近,我试图做的在C#System.String底层实现
string str = "u r awesome";
str[0]="i";
下,它不会工作,因为显然STR [1]仅仅是一个没有得到一组,所以我想知道什么字符串的底层实现是强制str [i]仅仅是一个get。
是不是它只是一个char *的托管包装?那么为什么我不能设置str [i]?
最近,我试图做的在C#System.String底层实现
string str = "u r awesome";
str[0]="i";
下,它不会工作,因为显然STR [1]仅仅是一个没有得到一组,所以我想知道什么字符串的底层实现是强制str [i]仅仅是一个get。
是不是它只是一个char *的托管包装?那么为什么我不能设置str [i]?
的其他人,放弃关于永恒的答案是正确的路线和是你遇到的问题的“实际”的原因。
既然你特别问了一下底层实现(如果只是出于好奇),并为其他人在这个问题可能绊倒一个参考,这里是从Eric Lippert关于该主题的更多信息:
“在.NET CLR中,字符串在内存中的布局与在OLE自动化中实现BSTR的方式几乎相同:作为字对齐的 由四字节整数组成的内存缓冲区,其长度为 字符串,然后是UTF-16数据的两个字节的 块中字符串的字符,后跟两个零字节。“
请注意这里的“非常多”部分,但BSTR本身也在Eric's blog中进行了说明。
请注意,所有这些都应视为实施细节。尽管它不应该真正关注我们大多数人,但它在调试互操作问题或一般理解时可能会有所帮助。
由于.NET String
类是不可变 - 您的内容在创建后无法更改,因此无法设置字符串的字符。这允许相同的字符串实例被安全地多次使用,而没有一个对象担心另一个对象将踩下它的字符串。
如果您需要可让您操作字符串的可变类,请考虑使用StringBuilder
代替。
如果要与C进行比较,String
类型与const char *
类似,只是不能丢弃常量。 StringBuilder
更像是一个char *
(具有自动分配大小调整)和一个方法(ToString()
)从其内容创建新的独立String
实例。
相关:StringBuilder内部细节http://stackoverflow.com/q/3564906/38206 –
像由cdhowie回答,这是不一样的在C柱的概念/ C++
如果你想在上面,作为一个建议,你可以尝试通过集装箱来模拟实现,如下面
List<char> str = new List<char>("u r awesome");
str[0] = 'i';
str[2] = 'm';
Console.WriteLine(str.ToArray());
这实际上是我正在寻找的答案,具体是关于如何实现字符串,谢谢! – etk1220