C#字符串以空字符串结尾吗?

21

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

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 的概念是什么?它到底是什么? - thecoop
7
万物皆空,虚无无处不在。 - BoltClock
我的问题是为什么这样一个毫无意义的问题会有这么多赞?知道C#字符串是否以空字符串结尾真的很重要吗?你会如何使用这样宝贵的信息呢? - Blake7
4个回答

18

EndsWith:

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

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

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

更新:

关于您最后一个示例 - 在LastIndexOf文档中有记录:

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


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

从MSDN - String Class (System)

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


6

试试这个:

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

所以,就像Oded所说的那样,它们总是匹配的。

哦,因为在 Q 上拥有一个关键性网站的代码片段而加 1 分? - Badr
我认为OP的代码str.LastIndexOf(string.Empty)==str.Length并不是一个错误,因为OP认为string.Empty是在g之后的东西。 - Bolu
1
当然,字符串使用基于0的索引,我只是为了好玩才写这个代码来验证是否空字符串会通过某种奇迹获得额外的索引:) - nan
这会使每个字符串的string.Length = string.Length + 1 :) - Pabuc
@Pabuc,为什么?你能再解释一下吗? - Bolu
当然可以,Bolu。正如Oded所说,对于LastIndexOf,如果值为string.empty,则返回值是该实例中的最后一个索引位置,即length-1。 - Pabuc

2
这样考虑:LastIndexOf在空字符串中没有意义。你可以说空字符串存在于字符串中的每个索引之间,即每个字符之间。因此,文档明确说明了应该返回什么:

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

至少在这种情况下,它返回了一个实际的索引。如果它返回字符串的长度(表示“结束”之后的索引,我认为这是您的观点),那么它将为一个甚至不是索引的方法LastIndexOf返回结果。
还有一种看待它的方式:如果我有这个:
Dim index As Integer = str.LastIndexOf("")

如果我可以这样做:

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

当使用LastIndexOf方法返回字符串中的最后一个索引时,如果返回结果是"",那么它确实起作用了。而如果返回结果是字符串的长度,则会出现ArgumentOutOfRangeException异常。 编辑:好像我错了,但愿我的第一个观点已经足够强大了 ;)


0

这个问题的更多信息和它的回答中还有一些。

特别地,"事实上,在每对字符之间逻辑上存在空字符串。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接