我有以下代码
char ptr=new char();
int counter = 1;
string s = new System.String(ptr, counter);
// does not show something
MessageBox.Show(s+"Something");
//shows something
MessageBox.Show("Something" + s);
Run Code Online (Sandbox Code Playgroud)
第一个Messagebox什么都没有显示 
第二个消息框显示了一些东西 
如果计数器值为0,则两个消息框都显示相同的结果,但如果计数器大于0,则会出现问题.
我认为这个问题是与new string(ptr, counter)动初始化
.但我想知道为什么会发生这种情况的内在机制.
Col*_*son 12
内部的ptr是null.因此,当您连接时,它将打印到空字符.因此,在运行时,MessageBox.Show(s + "Something");计算结果,MessageBox.Show("\0Something");而另一个计算结果为MessageBox.Show("Something\0");.
这就是为什么Something没有印在第一个上的原因.它超过了空字符.在Wikipedia上阅读更多关于Null-Terminated Strings(ASCIIZ)的内容.
在内部,.NET中的字符串只struct包含一个长度integer和一个char[]数组.但是,在传递给它时MessageBox.Show,它被传递给Win32 API函数MessageBox,该函数基于C,使用以null结尾的字符串.
最有可能的是,至少在optimize(Release)模式下的现代编译器中,编译器会看到你在字符串中添加了一个空字符,然后删除它后面的所有内容.在这种情况下,它只是\0为字符串分配.