C#字符串是否以空字符串结尾?

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

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

EndsWith

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

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

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

更新:

关于你的最后一个例子 – LastIndexOf记录了这个:

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


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

从MSDN – String Class (System)

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

试试这个:

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

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

想一想: LastIndexOf对于一个空字符串来说是没有意义的。 你可以说每个字符之间的字符串中的每个索引都存在空字符串。 因此, 文档为应该返回的内容提供了明确的答案:

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

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

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

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

…那么我应该能够做到这一点:

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

……然后回来。 果然,当LastIndexOf返回字符串中的最后一个索引时,它可以正常工作。 如果它返回字符串的长度 ,我会得到一个ArgumentOutOfRangeException 编辑 :好吧,看起来我错了。 希望我的第一点足够强大;)

这个问题及其答案中有更多信息。

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