为什么“ABCD” .StartsWith(“”)返回true?(Why does “abcd”.S

2019-07-18 19:06发布

标题是整个问题。 有人可以给我一个理由,为什么出现这种情况?

Answer 1:

是的 - 因为它没有与空字符串开头。 事实上,空字符串在逻辑上每对字符之间。

这样说吧:什么定义的“开头”你可以给会妨碍呢? 这里有一个简单的定义,没有“开头”:

“×其中y开始如果第一y.Length X那些Y的匹配的字符”。

一种替代(当量)的定义:

“×其中y开始如果x.Substring(0, y.Length).Equals(y)



Answer 2:

我会尝试阐述什么乔恩斯基特说。

比方说,x,y和z是字符串,+运营商实际上是在串联,则:

如果我们可以拆分Z到写Z = X + Y这意味着,Z,使用X启动。 因为每个字符串z中可以分割到z =“” + Z它遵循每个字符串开头“”。

所以,因为( “” + “ABCD”)== “ABCD” 它遵循 “ABCD”, “开头”



Answer 3:

该方法的参数值在该字符串,它是相同的长度值的开头进行比较,以子串,并返回一个值,指示它们是否相等。 是相等的,值必须是一个空串(空),该相同实例的引用,或匹配此实例的开头。

.NET String.StartsWith

真如果由参数表示的字符序列是由该字符串表示的字符序列的前缀; 否则为false。 还要注意如果参数是空字符串或等于由equals(Object)方法来确定此字符串对象,真正的将被返回

Java的String.startsWith



Answer 4:

我会与相关的事实,更容易理解开始。

空集是每个集合的子集。

为什么? 的定义 的子集的状态即A的一个子集B如果中的每个元素A是的元件B 。 相反, A不是的一个子集B如果存在的元件A不是的元素B

现在修复了一套B 。 我会建立空集的一个子集B 。 我将表明它不是空集是没有的一个子集的情况下做到这一点B 。 如果空集是没有的一个子集B然后我能找到的空集不在的元素B 。 但空集没有任何元素,因此我找不到,是不是在一个元素B 。 因此,它不是空集是不是的一个子集的情况下B 。 因此,空集必须的一个子集B

任何字符串以空字符串。

首先,我们必须承认我们与开始的定义。 让ststring小号我们说s 开头 t如果s.Length >= t.Length和第一t.Length的字符t匹配的s 。 也就是说, s.Length >= t.Length并为每Int32 index ,使得0 <= index < t.Lengths[index] == t[index]是真实的。 相反,我们要说的是, s不启动t如果语句

s.Length < t.Lengths.Length >= t.Length并且存在Int32 index ,使得0 <= index < t.Lengths[index] != t[index]

是真的。 用简单的英语, s短于t ,或者,如果没有,有一个字符t不匹配的字符作为在相同的位置s

现在修复串s 。 我会建立s与空字符串开头。 我将通过展示,这是不是说情况下做到这一点s不与空字符串开始。 如果s不与空字符串然后启动s.Length < String.Empty.Lengths.Length >= String.Empty.Length并且存在Int32 index ,使得0 <= index < String.Empty.Length 。 但s.Length >= 0String.Empty.Length等于零所以这是不可能的s.Length < String.Empty.Length是真实的。 类似地,由于``String.Empty.Length is equal to zero, there is no的Int32指数satisfying 0 <=索引<String.Empty.Length`。 因此

s.Length < String.Empty.Lengths.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;
}

上述两个粗体事实的例子空洞地真实的陈述 。 他们是真正凭借该语句定义它们( 子集 开头 )是事实, 通用的量化过空宇宙。 有在空集没有元素,所以不能没有一些其他的固定集空集的任何元素。 有在空字符串没有字符,所以不可能有一个字符作为不匹配在一些其它固定字符串相同的位置处的字符的空字符串一些位置。



Answer 5:

让我们只说"abcd".StartsWith("")返回false。

如果这样的话是什么下面的表达式EVAL来,真的还是假的:

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

事实证明,evals为true,因此该字符串不与空字符串;-)启动,或把换句话说,“ABCD”的子串起始位置0,并且具有0长度等于空字符串“”。 漂亮的逻辑海事组织。



Answer 6:

在C#这是如何规范告诉它反应;

是相等的,值必须是一个空串(空),该相同实例的引用,或匹配此实例的开头。



Answer 7:

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

真正的答案:

它必须这样,否则你不得不的情况下

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

    but yet

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

然后我们就会有2000年从头再来,因为一切取决于开始自己等于字符串将让我们的账户混合,突然比尔·盖茨将有我的财富,我有他,并且该死的银行软件! 命运只是不是那种给我。



Answer 8:

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



Answer 9:

只是为了记录在案, String.StartsWith()内部调用方法System.Globalization.CultureInfo.IsPrefix()这使得下面的检查明确:

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


Answer 10:

因为字符串“一无所有”开始好。



Answer 11:

如果您在正则表达式方面想起来了,这是有道理的。 每个字符串(不只是“ABCD”,也“”和“自卫队\ NFF”),评估的正则表达式时,返回true“开始与空字符串”。



Answer 12:

在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;
    }


文章来源: Why does “abcd”.StartsWith(“”) return true?