标题是整个问题。有人能告诉我为什么会这样吗?
答案 0 :(得分:162)
是 - 因为它确实以空字符串开头。实际上,空字符串逻辑上出现在每对字符之间。
这样说:你能给出什么样的“以...开头”的定义会排除这种情况?这是一个简单的“开头”定义,但不是:
“如果x的第一个y.Length
字符与y匹配,则x以y开头。”
替代(等效)定义:
“如果x.Substring(0, y.Length).Equals(y)
”
答案 1 :(得分:46)
我将尝试详细说明Jon Skeet所说的内容。
假设x,y和z是字符串而+运算符实际上是连接,那么:
如果我们可以将z分割为写z = x + y,这意味着z以x开头。 因为每个字符串z都可以拆分为z =“”+ z,所以每个字符串都以“”开头。
因此,因为(“”+“abcd”)==“abcd”,所以“abcd”以“”开头
答案 2 :(得分:17)
此方法将value参数与此字符串开头的子字符串进行比较,该字符串与value的长度相同,并返回一个值,指示它们是否相等。 要相等,value必须是空字符串(Empty),对此同一实例的引用,或匹配此实例的开头。
如果参数表示的字符序列是该字符串表示的字符序列的前缀,则为true;否则为false。否则是假的。 另请注意,如果参数为空字符串,则返回true,或者等于由equals(Object)方法确定的此String对象。
答案 3 :(得分:17)
我将从一个更容易理解的相关事实开始。
空集是每个集的子集。
为什么呢?如果A
的每个元素都是B
的元素,则definition 子集表明A
是B
的子集。相反,如果A
的元素不是B
的元素,则A
不是B
的子集。
现在修复一组B
。我将确定空集是B
的子集。我将通过显示空集不是B
的子集的情况来做到这一点。如果空集不是B
的子集,那么我可以找到不在B
中的空集的元素。但是空集没有任何元素,因此我找不到B
中没有的元素。因此,不是空集不是B
的子集的情况。因此,空集必须是B
的子集。
任何字符串都以空字符串开头。
首先,我们必须就以开头的定义达成一致。让s
和t
成为string
s如果s
和第一个t
我们说s.Length >= t.Length
以 t.Length
开头t
的{{1}}个字符与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
等于零,因此is equal to zero, there is no
不可能为真。类似地,因为``String.Empty.Length satisfying
Int32索引s.Length < String.Empty.Length
0&lt; = index&lt; 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;
}
的扩展名。
{{1}}
以上两个粗体事实是vacuously true statements的例子。它们是真实的,因为定义它们的语句(子集和以开头)在空宇宙上是universal quantifications。空集中没有元素,因此空集中的任何元素都不能存在于其他固定集中。空字符串中没有字符,因此不能有字符,因为空字符串中的某个位置与其他固定字符串中相同位置的字符不匹配。
答案 4 :(得分:11)
我们只是说"abcd".StartsWith("")
返回false。
如果是,则以下表达式eval为,true或false:
("abcd".Substring(0,0) == "")
事实证明,evals为true,所以字符串确实以空字符串开头;-),换句话说,“abcd”的子字符串从0位开始,0长度等于空字符串“” 。非常合乎逻辑的imo。
答案 5 :(得分:7)
在C#中,这是specification告诉它做出反应的方式;
要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头。
答案 6 :(得分:5)
为什么“abcd”.StartsWith(“”)返回true?
真正的答案:
必须是这样的,否则你会遇到
的情况 "".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
然后我们又重新获得了Y2K,因为依赖于相同字符串的所有银行软件都会让我们的帐户混乱,突然比尔盖茨将拥有我的财富而且我会拥有他的,并该死的!命运对我来说不是那么好。
答案 7 :(得分:4)
两个字符串的前N个字符是相同的。 N是第二个字符串的长度,即零。
答案 8 :(得分:4)
仅为记录,String.StartsWith()
在内部调用方法System.Globalization.CultureInfo.IsPrefix()
,它明确地进行以下检查:
if (prefix.Length == 0)
{
return true;
}
答案 9 :(得分:1)
因为一个字符串从“没有”开始很好。
答案 10 :(得分:1)
如果你用正则表达式术语来思考它,那就有意义了。 每个字符串(不只是“abcd”,也是“”和“sdf \ nff”), 在评估'begin with empty string'的正则表达式时返回true。
答案 11 :(得分:-1)
在C#中,它返回true
的原因是开发人员专门编写了它。
如果您查看source code,您将找到处理空字符串的特定逻辑:
public Boolean StartsWith(String value)
{
return StartsWith(value, StringComparison.CurrentCulture);
}
public Boolean StartsWith(String value, StringComparison comparisonType)
{
...
if (value.Length == 0)
{
return true;
}