2011-01-10 65 views
18

出于好奇,只是一个简短的问题。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 :) 
+0

什么是你的'string.Empty`的概念?它是什么? – thecoop 2011-01-10 13:58:18

+7

一切都不包含任何内容。什么都无处不在。 – BoltClock 2011-01-10 14:24:22

回答

17

EndsWith

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

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

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

更新:

关于你的最后一个例子 - 这是记录在LastIndexOf

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


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

从MSDN - String Class (System)

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

6

试试这个:

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

所以,是为俄德说,他们不总是一致。

2

想想这样:LastIndexOf是一种没有意义的空字符串。你可以说空字符串存在于每个索引内的字符串之间,每个字符之间。该documentation从而为什么应返回一个明确的答案:

如果值是String.Empty,返回 值是 这种情况下,最后一个索引位置。

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

下面是看它的另一种方式:如果我有这样的:

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

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

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

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

0

还有一些在this question及其答案更多的信息。

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

相关问题