为什么“abcd”.StartsWith(“”)返回true?

时间:2008-09-28 08:59:49

标签: c# java startswith

标题是整个问题。有人能告诉我为什么会这样吗?

12 个答案:

答案 0 :(得分:162)

是 - 因为它确实以空字符串开头。实际上,空字符串逻辑上出现在每对字符之间。

这样说:你能给出什么样的“以...开头”的定义会排除这种情况?这是一个简单的“开头”定义,但不是:

“如果x的第一个y.Length字符与y匹配,则x以y开头。”

替代(等效)定义:

“如果x.Substring(0, y.Length).Equals(y)

,则x以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),对此同一实例的引用,或匹配此实例的开头。

.NET String.StartsWith

如果参数表示的字符序列是该字符串表示的字符序列的前缀,则为true;否则为false。否则是假的。 另请注意,如果参数为空字符串,则返回true,或者等于由equals(Object)方法确定的此String对象。

Java String.startsWith

答案 3 :(得分:17)

我将从一个更容易理解的相关事实开始。

空集是每个集的子集。

为什么呢?如果A的每个元素都是B的元素,则definition 子集表明AB的子集。相反,如果A的元素不是B的元素,则A不是B的子集。

现在修复一组B。我将确定空集是B的子集。我将通过显示空集不是B的子集的情况来做到这一点。如果空集不是B的子集,那么我可以找到不在B中的空集的元素。但是空集没有任何元素,因此我找不到B中没有的元素。因此,不是空集不是B的子集的情况。因此,空集必须是B的子集。

任何字符串都以空字符串开头。

首先,我们必须就开头的定义达成一致。让st成为string s如果s和第一个t我们说s.Length >= t.Length t.Length开头t的{​​{1}}个字符与s的字符相匹配。也就是说,s.Length >= t.LengthInt32 index 0 <= index < t.Lengths[index] == t[index]s为真。相反,如果声明

,我们会说t不会以s.Length < t.Length开头

s.Length >= t.LengthInt32 index并且有一个0 <= index < t.Lengths[index] != t[index]s

是真的。在简单的英语中,tt短,或者,如果没有,则s中的字符与s中的相同位置不匹配。

现在修复字符串s。我将确定s以空字符串开头。我将通过显示s不是以空字符串开头的情况来做到这一点。如果s.Length < String.Empty.Length不是以空字符串开头,那么s.Length >= String.Empty.LengthInt32 index0 <= index < String.Empty.Length就是s.Length >= 0。但String.Empty.Lengths.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.LengthInt32 index并且有一个0 <= index < String.Empty.Lengths

是假的。因此,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;
    }