我最近在c#中尝试执行以下操作
string str = "u r awesome";
str[0]="i";
Run Code Online (Sandbox Code Playgroud)
并且它不起作用,因为显然str [i]只是一个get而不是set,所以我想知道string的底层实现是什么会强制str [i]只是一个get.
它不仅仅是char*的托管包装器吗?那么为什么我不能设置str [i]?
您不能设置字符串的字符,因为.NET String类是不可变的 - 这意味着它的内容在创建后无法更改.这允许相同的字符串实例安全地使用多次,而没有一个对象担心另一个对象会踩到它的字符串.
如果您需要一个允许操作字符串的可变类,请考虑使用StringBuilder.
如果你想与C进行比较,那么String类型就像const char *你不能只丢弃const. StringBuilder更像是一个char *(使用自动分配大小调整)和一个方法(ToString())String从其内容创建一个新的独立实例.
其他人提出的关于不变性的答案当然是正确的,并且是您遇到问题的"实际"原因.
由于您特别询问了底层实现(并且仅仅是出于好奇),并且作为对可能偶然发现此问题的其他人的参考,以下是Eric Lippert关于该主题的更多信息:
"在.NET CLR中,字符串在内存中布局的方式与在OLE自动化中实现BSTR的方式非常相似:作为字对齐的内存缓冲区,由四字节整数组成,给出字符串的长度,然后是两个字节的UTF-16数据块中的字符串字符,后跟两个零字节."
注意这里的"几乎"部分,但是在Eric的博客中也解释了BSTR本身.
请注意,所有这些都应被视为实施细节.即使它不应该真正涉及我们大多数人,但它可能有助于调试互操作问题或一般理解.
| 归档时间: |
|
| 查看次数: |
2088 次 |
| 最近记录: |