“;为什么";字符串后面.字符串末尾为空

本文关键字:字符串 quot 为什么 | 更新日期: 2023-09-27 17:58:32

背景

我使用的是一个分隔字符串,当我注意到数组中的最后一个点是""时,我正在使用string.Split将每个子字符串放入一个数组中。由于我在数组的最后一个索引处寻找特定的子字符串,我最终看到了这篇文章,解释了所有字符串都以string.Empty结尾。

示例

以下显示了此行为的实际操作。当我拆分句子并将每个子字符串写入控制台时,我们可以看到最后一个元素是空字符串:

public class Program
{
    static void Main(string[] args)
    {
        const string mySentence = "Hello,this,is,my,string!";
        var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);
        foreach (var word in wordArray)
        {
            var message = word;
            if (word == string.Empty) message = "Empty string";
            Console.WriteLine(message);
        }         
        Console.ReadKey();
    }
}

问题&"修复"

从概念上讲,每个字符之间都有空字符串,但为什么String即使在字符串的末尾也会这样呢?"ABC"等价于"ABC" + ""ABC + "" + "" + "",这似乎令人困惑,那么为什么不将字符串字面上视为仅"ABC"呢?有一个"修复"它,以获得我想要的"真正的"子字符串:

public class Program
{
    static void Main(string[] args)
    {
        const string mySentence = "Hello,this,is,my,string!";
        var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);
        var wordList = new List<string>();
        wordList.AddRange(wordArray);
        wordList.RemoveAt(wordList.LastIndexOf(string.Empty));
        foreach (var word in wordList)
        {
            var message = word;
            if (word == string.Empty) message = "Empty string";
            Console.WriteLine(message);
        }
        Console.ReadKey();
    }
}

但我仍然不明白为什么字符串的末尾会被用同样的行为处理,因为后面没有其他需要空字符串的字符。它对编译器有什么作用吗?

“;为什么";字符串后面.字符串末尾为空

空字符串是字符串的0。它们无处不在。

很自然,"ABC"等同于"ABC"+"或ABC+"+""+"。就像3等于3+0或3+0+0+0是很自然的。

事实上,在"Hello,this,is,my,string!".Split('!')之后有一个空字符串,这意味着你的字符串以"!"

之所以会发生这种情况,是因为您使用的是StringSplitOptions.None,而其中一个分隔符值出现在字符串的末尾。该选项的全部目的是创建您正在观察的行为:它将包含N个分隔符的字符串拆分为N+1个片段。

要查看您想要的行为,请使用StringSplitOptions.RemoveEmptyEntries:

var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.RemoveEmptyEntries);

至于为什么你看到了你所看到的。StringSplitOptions.None的行为是找到输入字符串中分隔符所在的所有位置,并返回分隔符前后的每个片段的数组。这可能很有用,例如,如果您正在解析一个字符串,您知道该字符串正好有N个部分,但其中一些部分可能是空的。因此,例如,在逗号分隔符上拆分以下内容,它们将分别产生正好3个部分:

a,b,c
a,b,
a,,c
a,,
,b,c
,b,
,,c
,,

如果您想在分隔符之间允许空值,但不允许在开始或结束时使用,您可以在拆分之前剥离字符串开始或结束处的分隔符:

var wordArray = Regex
    .Replace(mySentence, "^[,!]|[,!]$", "")
    .Split(new[] {",", "!"}, StringSplitOptions.None);

""Hello,this,is,my,string!的每个字母之间的间隙,因此当字符串被,!分割时,结果是Hellothisismystring""""是字符串末尾和!之间的空字符。

如果将""替换为可见字符(例如#),则字符串将类似于此#H#e#l#l#o#,#t#h#i#s#,#i#s#,#m#y#,#s#t#r#i#n#g#!#