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

时间:2011-01-10 13:56:05

标签: c# .net string

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

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

4 个答案:

答案 0 :(得分:17)

EndsWith

  

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

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

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

更新

关于您的上一个示例 - LastIndexOf上记录了这一点:

  

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


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

来自MSDN - String Class (System)

  

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

答案 1 :(得分:6)

试试这个:

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

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

答案 2 :(得分:2)

以这种方式思考:LastIndexOf对于空字符串来说是没有意义的。你可以说空字符串存在于每个字符之间的字符串中的每个索引处。 documentation因此为应该返回的内容提供了明确的答案:

  

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

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

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

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

...然后我应该能够做到这一点:

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

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

答案 3 :(得分:0)

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

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