为什么c# IndexOf搜索空字符返回零?



下面是我使用。net Core 6的示例代码:

using System;
namespace testTerminator
{
class Program
{
static void Main(string[] args)
{
// Given an array of bytes:
byte[] array = {72, 101, 108, 108, 111, 0, 0, 32, 72, 101};
// Converted to a string:
string data = System.Text.Encoding.ASCII.GetString(array);

// Why does the following line not return the position
// of the null characters?
int terminator = data.IndexOf("");  // returns 0
// Output:
Console.WriteLine("Data is '{0}'", data);
Console.WriteLine("Found terminator at {0}", terminator);
// Verify null characters are still in the data string:
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(data);
for (int i = 0; i<dataBytes.Length; i++){
Console.Write("{0},", dataBytes[i]);
}
Console.WriteLine();
}
}
}

结果如下:

Data is 'Hello He'
Found terminator at 0
72,101,108,108,111,0,0,32,72,101,

为什么IndexOf("")返回零当空字符在位置6?

@AndrewS在评论中指出,这是由Microsoft记录的。默认情况下使用CurrentCulture,如果该区域性存在被忽略的字符,则返回0。在。net 5中,Unicode库发生了变化,这影响了这个。

注意,您可以在一个简单的一行代码中复制它:

Console.WriteLine("abc".IndexOf(""));

要解决这个问题,需要使用顺序比较

int terminator = data.IndexOf("", StringComparison.Ordinal);  // returns 0

奇怪的是,当你使用char版本时,它不会这样做

Console.WriteLine("abc".IndexOf(''));

返回3。这是因为它默认执行顺序比较。

由于我的代表不到50岁,我不能发表评论。我用Net Core 3.1在我的vs 2019社区上尝试了你的代码输出如下;

"数据是"你好他"在5点找到了终点72101108108111, 0, 0, 32岁,72101,">

这不是什么大事,但你可能想尝试不同版本的Net Core

,

最新更新