标题是整个问题。有人可以告诉我为什么会这样吗?
Answers:
是的-因为它确实以空字符串开头。实际上,空字符串在逻辑上在每对字符之间出现。
这么说:您能给“开始于”的什么定义排除这种情况?这是“开始于”的简单定义,它没有:
“如果x的前y.Length
几个字符与y的第一个字符匹配,则x以y开头。”
替代(等效)定义:
“如果x.Substring(0, y.Length).Equals(y)
“ x以y开头”
此方法将value参数与该字符串开头的子字符串进行比较,该字符串的长度与value相同,并返回一个值,该值指示它们是否相等。为了相等,value必须是一个空字符串(Empty),对该相同实例的引用或与该实例的开头匹配。
如果参数表示的字符序列是此字符串表示的字符序列的前缀,则为true;否则为true。否则为假。还要注意,如果参数为空字符串或等于由equals(Object)方法确定的String对象,则将返回true。
我将从一个易于理解的相关事实开始。
空集是每个集的子集。
为什么?该定义的子集指出A
的一个子集B
,如果每一个元素A
是一个元素B
。相反,如果不是的元素,A
则不是的子集。B
A
B
现在修复一个集合B
。我将确定空集是的子集B
。我将通过显示空集不是的子集来实现这一点B
。如果空集不是的子集,B
那么我可以找到不在中的空集的元素B
。但是空集没有任何元素,因此我找不到不在中的元素B
。因此,并非不是空集不是的子集B
。因此,空集必须是的子集B
。
任何字符串都以空字符串开头。
首先,我们必须同意以开头的定义。Let s
and t
be string
s我们说它s
以 t
ifs.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 index satisfying
0 <= index <String.Empty.Length`。因此
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("")
return false。
如果是这样,那么以下表达式的含义是正确还是错误:
("abcd".Substring(0,0) == "")
结果表明evals为true,因此该字符串确实以空字符串;-)开头,或者换句话说,“ abcd”的子字符串从位置0开始,长度为0等于空字符串“”。十分合逻辑的imo。
null
返回值也同样合适。
为什么“ abcd” .StartsWith(“”)返回true?
真正的答案:
一定是那样,否则你会遇到这样的情况
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
然后我们又要重新开始Y2K了,因为所有依赖以相等的字符串开头的银行软件都将使我们的账户混在一起,突然比尔·盖茨就会拥有我的财富,而我会拥有他的财产,该死的!命运对我而言不是那样。
仅作记录,在String.StartsWith()
内部调用该方法System.Globalization.CultureInfo.IsPrefix()
,以明确进行以下检查:
if (prefix.Length == 0)
{
return true;
}
如果您以正则表达式的方式来考虑它,那是有道理的。在评估“从空字符串开始”的正则表达式时,每个字符串(不仅是“ abcd”,还有“”和“ sdf \ nff”)都返回true。