タイトルは質問全体です。誰かが私にこれが起こる理由を教えてもらえますか?
回答:
はい-空の文字列で始まるためです。実際、空の文字列は論理的にすべての文字ペアの間に発生します。
このように言えば、これを排除する「で始まる」の定義をどのように与えることができますか?「で始まる」の簡単な定義は次のとおりです。
「xの最初のy.Length文字がyの最初の文字と一致する場合、xはyで始まります。」
代替(同等の)定義:
「xはyで始まりますx.Substring(0, y.Length).Equals(y)」
このメソッドは、valueパラメーターを、valueと同じ長さのこの文字列の先頭にある部分文字列と比較し、それらが等しいかどうかを示す値を返します。等しくするには、値は空の文字列(Empty)、この同じインスタンスへの参照、またはこのインスタンスの先頭と一致する必要があります。
引数で表される文字シーケンスが、この文字列で表される文字シーケンスのプレフィックスである場合はtrue。それ以外の場合はfalse。引数が空の文字列であるか、equals(Object)メソッドによって決定されたこのStringオブジェクトと等しい場合、trueが返されることにも注意してください。
理解しやすい関連する事実から始めましょう。
空のセットは、すべてのセットのサブセットです。
どうして?定義のサブセットの状態AのサブセットでBのすべての要素があればAの要素ですB。逆に、の要素ではない要素がある場合のAサブセットではありません。BAB
セットを修正しますB。空集合がのサブセットであることを確認しBます。空のセットがのサブセットではないことを示すことによってこれを行いますB。空のセットがのサブセットではなかった場合、にない空のセットBの要素を見つけることができましたB。しかし、空のセットには要素がないため、にない要素を見つけることができませんB。したがって、空集合がのサブセットではないというわけではありませんB。したがって、空のセットはのサブセットである必要がありますB。
すべての文字列は空の文字列で始まります。
まず、で始まるの定義に同意する必要があります。Let sand tbe stringss は、 t ifs.Length >= t.Lengthとの最初のt.Length文字tがs。の文字と一致することから始まります。つまり、s.Length >= t.LengthそしてそのInt32 indexようなすべてについて0 <= index < t.Length、s[index] == t[index]は真実です。逆に、我々はそれが言うsと起動しないtif文
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真になることは不可能です。同様に、 `` String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`なので。したがって、
s.Length < String.Empty.Lengthまたはs.Length >= String.Empty.LengthそしてそのInt32 indexようなものがあります0 <= index < String.Empty.Length
は誤りです。したがって、s空の文字列で始まらない場合はありません。したがって、s空の文字列で開始する必要があります。
以下は、の拡張子としてコード化されたstartsの実装です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;
}
上記の2つの太字の事実は、空虚な真のステートメントの例です。それらを定義するステートメント(サブセットで始まり)が空の宇宙に対する全称記号であるという事実のおかげで、それらは真実です。空のセットには要素がないため、他の固定セットにない空のセットの要素はありません。空の文字列には文字がないため、空の文字列の一部の位置が他の固定文字列の同じ位置の文字と一致しないため、文字を含めることはできません。
"abcd".StartsWith("")falseを返すとしましょう。
もしそうなら、次の式は真または偽で何を評価しますか?
("abcd".Substring(0,0) == "")
evalsがtrueであることが判明したため、文字列は空の文字列で始まります;-)つまり、位置0で始まり長さが0の「abcd」の部分文字列は空の文字列「」と等しくなります。かなり論理的なイモ。
null同様に適切な戻り値であるように、結果は「未定義」と宣言されている可能性もあります。
「abcd」.StartsWith(“”)がtrueを返すのはなぜですか?
本当の答え:
そうでなければ、次のような場合があります。
"".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;
}
文字列は「何もない」で始まるからです。
正規表現で考えると理にかなっています。すべての文字列(「abcd」だけでなく、「」と「sdf \ nff」も)は、「空の文字列で始まる」の正規表現を評価するときにtrueを返します。