我有以下代码
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
包含一个长度int
eger和一个char[]
数组.但是,在传递给它时MessageBox.Show
,它被传递给Win32 API函数MessageBox
,该函数基于C,使用以null结尾的字符串.
最有可能的是,至少在optimize
(Release
)模式下的现代编译器中,编译器会看到你在字符串中添加了一个空字符,然后删除它后面的所有内容.在这种情况下,它只是\0
为字符串分配.
归档时间: |
|
查看次数: |
350 次 |
最近记录: |