为什么字符串的功能不同

Md *_*ker 7 .net c#

我有以下代码

 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为字符串分配.

  • 只是FYI:在任何情况下都不会打印"1"...`new String(char,int)`生成一个由`char`重复`int`次组成的字符串,例如`new String(ptr,5)`会产生"\ 0\0\0\0\0".这就是为什么`new String(ptr,0)`有效 - 它产生一个没有NUL字符的空字符串.:) (3认同)
  • @SargeBorsch 不,但是 MeassageBox 传递给的 API 会检查以 null 结尾的字符串。 (2认同)