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."