为什么 C# IndexOf 搜索空字符 return 零?

Why does C# IndexOf search for null characters return zero?

这是我使用 .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("[=11=][=11=]");  // 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,

当空字符位于位置 6 时,为什么 IndexOf("[=19=][=19=]") return 为零?

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

” 数据是 'Hello He' 在 5 处找到终止符 72,101,108,108,111,0,0,32,72,101, “

这没什么大不了的,但您可能想尝试使用不同版本的 Net Core

最佳,

by @AndrewS in the comments, this is documented by Microsoft. 默认情况下使用 CurrentCulture,如果该文化存在被忽略的字符,则默认使用 returns 0。在 .Net 5 中,Unicode 库发生了变化,这影响了这一点。

请注意,您可以在一个简单的 one-liner:

中重现此内容
Console.WriteLine("abc[=10=]".IndexOf("[=10=]"));

要解决此问题,您需要使用序号比较

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

奇怪的是,当您使用 char 版本时它不会执行此操作

Console.WriteLine("abc[=12=]".IndexOf('[=12=]'));

Returns3。这是因为它进行了序数比较 by default.