标题就是整个问题。有人能给我一个为什么会发生这种情况的原因吗?
是的 - 因为它确实以空字符串开头。实际上,在每对字符之间都逻辑上存在空字符串。
这样说吧:你能给出什么“以...开始”的定义,使得这种情况不成立吗?以下是一个简单的“以...开始”的定义,它并不排除这种情况:
“如果x的前y.Length
个字符与y的相同,则x以y开头。”
另一种(等价的)定义:
“如果x.Substring(0, y.Length).Equals(y)
,则x以y开头。”
我将尝试详细说明Jon Skeet所说的内容。
假设x、y和z是字符串,+运算符实际上是连接操作,那么:
如果我们可以把z分解为z = x + y,那就意味着z以x开头。 因为每个字符串z都可以被分解为z = "" + z,所以每个字符串都以""开头。
所以,因为("" + "abcd")== "abcd",所以"abcd"以""开头。
我将从一个更易理解的相关事实开始。
空集是每个集合的子集。
为什么?子集的定义指出,如果A
的每个元素都是B
的元素,则A
是B
的子集。反之,如果A
存在一个不是B
的元素,则A
不是B
的子集。
现在固定一个集合B
。我将证明空集是B
的子集。我将通过展示不是空集不是B
的子集来证明这一点。如果空集不是B
的子集,则我可以找到一个空集的元素不在B
中。但是,空集没有任何元素,因此我无法找到不在B
中的元素。因此,空集不是不是B
的子集。因此,空集必须是B
的子集。
任何字符串都以空字符串开头。
首先,我们必须就“以...开始”这一定义达成共识。假设有字符串s
和t
,我们说s
以t
开头,如果s.Length >= t.Length
且t
的前t.Length
个字符与s
的相同。也就是说,s.Length >= t.Length
,对于每个满足0 <= index < t.Length
的Int32 index
,都有s[index] == t[index]
。反之,如果语句
s.Length < t.Length
或者s.Length >= t.Length
且存在一个Int32 index
满足0 <= index < t.Length
且s[index] != t[index]
成立,我们将说s
不以t
开头。换言之,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”等于零,不存在满足0 <= index < String.Empty.Length
的Int32 index
。因此
s.Length < String.Empty.Length
或s.Length >= String.Empty.Length
,并且存在一个Int32 index
,使得0 <= index < String.Empty.Length
是假的。因此,不是s
不以空字符串开头。因此,s
必须以空字符串开头。
以下是作为string
扩展编码的starts with的实现。
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;
}
该方法将value参数与此字符串开头与value长度相同的子字符串进行比较,并返回指示它们是否相等的值。为了相等,value必须是空字符串(Empty)、对此实例的引用或匹配此实例开头的字符串。
如果参数表示的字符序列是该字符串所表示的字符序列的前缀,则返回true;否则返回false。还请注意,如果参数是空字符串或根据equals(Object)方法确定与此String对象相等,则将返回true。
假设 "abcd".StartsWith("")
返回 false。
那么以下表达式的值是 true 还是 false:
("abcd".Substring(0,0) == "")
事实证明它的值为真,因此该字符串确实以空字符串开头 ;-),或者换句话说,从位置0开始并且长度为0的“abcd”子字符串等于空字符串“”。在我看来相当合乎逻辑。
null
也是一个同样适当的返回值。 - Tom Lint "".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;
}
因为一个字符串以“nothing”开头。