【问题标题】:Do C# strings end with empty string?C# 字符串是否以空字符串结尾?
【发布时间】:2025-08-15 04:50:02
【问题描述】:

出于好奇,我只是一个简短的问题。

string str = "string";
Console.WriteLine(str.EndsWith(string.Empty));                  //true
Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length); //false
//of course string are indexed from 0, 
//just wrote if for fun to check whether empty string get some extra index
///somehow by a miracle:)

//finally

Console.WriteLine(str.LastIndexOf(string.Empty) 
               == str.LastIndexOf('g'));                        //true :)

【问题讨论】:

  • 你对string.Empty的概念是什么? 是什么
  • 一切都不包含任何东西。无处不在。
  • 我的问题是,为什么会有这么多赞成票支持这样一个毫无意义的问题?为什么知道 C# 字符串是否以空字符串结尾很重要?您将如何使用这些有价值的信息?

标签: c# .net string


【解决方案1】:

EndsWith:

确定此字符串实例的结尾是否与指定的字符串匹配。

所有字符串都将匹配结尾处的""...或字符串的任何其他部分。为什么?因为从概念上讲,每个字符周围都有空字符串。

"" + "abc" + "" == "abc" == "" + "a" + "" + "b" + "" + "c" + ""

更新:

关于您的最后一个示例 - 记录在 LastIndexOf:

如果 value 是 String.Empty,则返回值是该实例中的最后一个索引位置。


一个相关的问题是使用 null 作为字符串终止符 - 这发生在 C 和 C++ 中,但不是 C#。

来自 MSDN - String Class (System):

在 .NET Framework 中,String 对象可以包含嵌入的空字符,这些字符计为字符串长度的一部分。但是,在某些语言(例如 C 和 C++)中,空字符表示字符串的结尾;它不被视为字符串的一部分,也不计入字符串长度的一部分。

【讨论】:

    【解决方案2】:

    试试这个:

    string str = "string";
    Console.WriteLine(str.EndsWith(string.Empty));                  //true 
    Console.WriteLine(str.LastIndexOf(string.Empty) == str.Length-1); // true
    Console.ReadLine();
    

    所以是的,正如 Oded 所说,它们总是匹配的。

    【讨论】:

    • ooh 不错,因为在 Q 上有一个关键站点?代码sn-p
    • 我不认为 OP 的代码 str.LastIndexOf(string.Empty)==str.Length 是一个错误,因为 OP 认为 string.Empty 是在 g 之后
    • 当然,字符串使用从0开始的索引,我写它只是为了检查空字符串是否奇迹般地获得了一些额外的索引:)
    • 这将使每个字符串的 string.Length = string.Length + 1 :)
    • @Pabuc,为什么?你能再解释一下吗?
    【解决方案3】:

    这样想:LastIndexOf 对于空字符串来说有点无意义。您可以说空字符串存在于字符串中每个字符之间的 every 索引处。因此,documentation 为应该返回的内容提供了明确的答案:

    如果值为String.Empty,则返回 value 是最后一个索引位置 这个实例。

    至少在这种情况下它返回一个实际索引。如果它返回字符串的长度(表示“结束后”的索引,我相信这是您的观点),它将返回一个名为 LastIndexOf 的方法的结果,甚至不是索引。

    这是另一种看待它的方式:如果我有这个:

    Dim index As Integer = str.LastIndexOf("")
    

    ...那么我应该可以做到这一点:

    Dim substr As String = str.Substring(index, "".Length)
    

    ...然后返回""。果然,当LastIndexOf 返回字符串中的last 索引时,它就起作用了。 如果它返回字符串的长度,我会得到ArgumentOutOfRangeException 编辑:好吧,看来我错了。希望我的第一点本身就足够强大;)

    【讨论】:

      【解决方案4】:

      this question 及其答案中有更多信息。

      特别是"Indeed, the empty string logically occurs between every pair of characters."

      【讨论】: