标题是整个问题。有人能给我一个理由为什么会这样?

有帮助吗?

解决方案

是的-因为它并开始与empty string.事实上,空串逻辑之间发生的每一对字。

把它这样说:什么定义"开始"你能给这将排除这个吗?这里有一个简单的定义"开始"不:

"x始y如果第一 y.Length 人物的x相匹配的。"

一个替代(等)定义:

"x始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。否则是假的。 另请注意,如果参数为空字符串,则返回true,或者等于由equals(Object)方法确定的此String对象。

Java String.startsWith

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

空集是每个集的子集。

为什么呢? 子集定义指出 A 如果 A 的每个元素都是 B 的元素,则它是 B 的子集。相反,如果 A 的元素不是 B的元素 A 不是 B 的子集>

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

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

首先,我们必须就开头的定义达成一致。让 s t string s我们说 s t 如果 s.Length> = t.Length 并且 t 的第一个 t.Length 字符与代码>取值。也就是说, 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< =指数< String.Empty.Length 。但 s.Length> = 0 String.Empty.Length 等于零,因此 s.Length< String.Empty.Length 为true。类似地,由于``String.Empty.Length 等于零,因此没有 Int32索引满足 0< = index< String.Empty.Length`。因此

s.Length< String.Empty.Length s.Length> = String.Empty.Length 并且有一个 Int32 index 0< =指数< 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;
}

以上两个粗体事实是空洞真实陈述的示例。它们是真实的,因为定义它们的语句(子集开头)是通用量化。有

我们只说&quot; abcd&quot; .StartsWith(&quot;&quot;)返回false。

如果是,则以下表达式eval为,true或false:

 ("abcd".Substring(0,0) == "")

事实证明,evals为true,所以字符串确实以空字符串开头;-),或换句话说,“abcd”的子字符串从位置0开始并且具有0长度等于空字符串“”。非常合乎逻辑的imo。

在C#中,规范告诉它做出反应;

  

要相等,value必须是空字符串(Empty),对此同一实例的引用,或者匹配此实例的开头。

  

为什么&#8220; abcd&#8221; .StartsWith(&#8220;&#8221;)返回true?

真正的答案:

必须是这样的,否则你会遇到

的情况
    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

然后我们又重新获得了Y2K,因为依赖于相同字符串的所有银行软件都会让我们的帐户混乱,突然比尔盖茨将拥有我的财富而且我会拥有他的,并该死的!命运对我来说不是那么好。

两个字符串的前N个字符是相同的。 N是第二个字符串的长度,即零。

仅为记录, String.StartsWith()在内部调用方法 System.Globalization.CultureInfo.IsPrefix(),它明确地进行以下检查:

if (prefix.Length == 0)
{
    return true;
}

因为字符串以“没有”开头很好。

如果你用正则表达式术语来思考它,那就有意义了。 每个字符串(不仅仅是“abcd”,还有“&quot;”和“sdf \ nff”), 在评估'begin with empty string'的正则表达式时返回true。

在C#中,它返回 true 的原因是开发人员专门编写了它。

如果您查看源代码,那么'找到处理空字符串的特定逻辑:

public Boolean StartsWith(String value)
{
    return StartsWith(value, StringComparison.CurrentCulture);
}

public Boolean StartsWith(String value, StringComparison comparisonType)
{
    ...

    if (value.Length == 0)
    {
        return true;
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top