gpt4 book ai didi

c# - 为什么字符串的功能不同

转载 作者:太空狗 更新时间:2023-10-29 20:00:07 26 4
gpt4 key购买 nike

我有以下代码

 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);

第一个消息框什么也没显示enter image description here

第二个消息框显示了一些东西 enter image description here

如果计数器值为 0,则两个消息框显示相同的结果,但如果计数器大于 0,则会出现问题。

我认为问题在于 new string(ptr, counter) 初始化

.但我想知道发生这种情况的内部机制。

最佳答案

ptr是一个空字符('\0'),s是一个string,只有一个副本该字符(即 "\0")。因此,在运行时,您的第一个调用的参数计算为 "\0Something",而您的另一个调用的参数计算为 "Something\0"

在C#中,string允许有空字符;您可以将它们概念化为一个 char[] 数组(长度已知);所以空字符是可以的。当您传递给 C API 时,就会出现问题。 C 没有字符串,因此使用 null-terminated strings 模仿它们.就任何 C API 而言,"\0Something" 是一个空字符串(strlen 将返回 0)。因此,当您使用 MessageBox.Show 时,您的字符串将传递给 Win32 API 函数 MessageBoxW它只理解以 null 结尾的字符串。


来自 .NET source code for MessageBox.Show(string)

public static DialogResult Show(string text)
{
return ShowCore(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, 0, false);
}

走向the end of ShowCore ,我们看到这一行:

return (DialogResult)MessageBoxW(handle, text, caption, style);

MessageBoxW 调用是 user32.dll 中的 Win32 API 函数。

关于c# - 为什么字符串的功能不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com