标题是整个问题.有人能告诉我为什么会这样吗?
是的 - 因为它确实以空字符串开头.实际上,空字符串逻辑上发生在每对字符之间.
这样说:你可以给出什么样的"以...开头"的定义会排除这种情况?以下是"以...开头"的简单定义:
"如果x的第一个y.Length
字符与y 匹配,则x 以y开头."
另一种(等效的)定义:
"如果是,则以y开头x.Substring(0, y.Length).Equals(y)
"
我将试着详细说明Jon Skeet所说的话.
假设x,y和z是字符串,而+运算符实际上是连接,那么:
如果我们可以将z分割为写z = x + y,这意味着z以x开头.因为每个字符串z都可以拆分为z =""+ z,所以每个字符串都以""开头.
所以,因为(""+"abcd")=="abcd",所以"abcd"以""开头
此方法将value参数与此字符串开头的子字符串进行比较,该字符串与value的长度相同,并返回一个值,指示它们是否相等.要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头.
.NET String.StartsWith
如果参数表示的字符序列是此字符串表示的字符序列的前缀,则返回true;否则返回false.否则是假的.另请注意,如果参数为空字符串或等于此equals(Object)方法确定的String对象,则返回true.
Java String.startsWith
我将从一个更容易理解的相关事实开始.
空集是每个集的子集.
为什么?该定义的子集指出A
的一个子集B
,如果每一个元素A
是一个元素B
.相反,如果有一个元素不是元素,A
则不是它的子集.B
A
B
现在修一套B
.我将确定空集是其中的一个子集B
.我将通过显示空集不是其子集的情况来做到这一点B
.如果空集不是其中的子集,B
那么我可以找到不在的空集的元素B
.但是空集没有任何元素,因此我找不到不存在的元素B
.因此,不是空集不是其子集的情况B
.因此,空集必须是其子集B
.
任何字符串都以空字符串开头.
首先,我们必须就我们对起点的定义达成一致.让我们s
和t
是string
小号我们说s
开头 t
,如果s.Length >= t.Length
和第一t.Length
的字符t
匹配的s
.也就是说,s.Length >= t.Length
并为每个Int32 index
这样0 <= index < t.Length
,s[index] == t[index]
是真实的.相反,我们会说这s
不是从t
声明开始的
s.Length < t.Length
或者s.Length >= t.Length
有一个Int32 index
这样的0 <= index < t.Length
和s[index] != t[index]
是真的.在简单的英语中,s
短于t
或者,如果没有,则有一个字符t
与该字符不匹配的位置相同s
.
现在修复一个字符串 是假的.因此, 以下是一个开头的实现,编码为扩展名 以上两个粗体事实是空洞真实陈述的例子.它们是真实的,因为定义它们的语句(子集和开头)是空宇宙的通用量化.空集中没有元素,因此空集中的任何元素都不能存在于其他固定集中.空字符串中没有字符,因此不能有字符作为空字符串中的某个位置与其他固定字符串中相同位置的字符不匹配.s
.我将建立s
以空字符串开头的东西.我将通过显示s
不是以空字符串开头的情况来做到这一点.如果s
不是以空字符串开头那么s.Length < String.Empty.Length
或者s.Length >= String.Empty.Length
有Int32 index
这样的话0 <= index < String.Empty.Length
.但是s.Length >= 0
并且String.Empty.Length
等于零,因此不可能s.Length < String.Empty.Length
成为现实.同样,因为``String.Empty.Length is equal to zero, there is no
Int32索引satisfying
0 <= index s.Length < String.Empty.Length
或者s.Length >= String.Empty.Length
有Int32 index
这样的0 <= index < String.Empty.Length
s
不是以空字符串开头的情况.因此,s
必须以空字符串开头.string
.public static bool DoStartsWith(this string s, string t) {
if (s.Length >= t.Length) {
for (int index = 0; index < t.Length; index++) {
if (s[index] != t[index]) {
return false;
}
}
return true;
}
return false;
}
我们只是说"abcd".StartsWith("")
返回false.
若是,则以下表达式eval为,true或false:
("abcd".Substring(0,0) == "")
事实证明,evals为true,所以字符串确实以空字符串开头;-),换句话说,"abcd"的子字符串从位置0开始,0长度等于空字符串"".相当合乎逻辑的imo.
在C#中,这是规范告诉它做出反应的方式;
要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头.