タイトルは質問全体です。誰かが私にこれが起こる理由を教えてもらえますか?
回答:
はい-空の文字列で始まるためです。実際、空の文字列は論理的にすべての文字ペアの間に発生します。
このように言えば、これを排除する「で始まる」の定義をどのように与えることができますか?「で始まる」の簡単な定義は次のとおりです。
「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
サブセットではありません。B
A
B
セットを修正しますB
。空集合がのサブセットであることを確認しB
ます。空のセットがのサブセットではないことを示すことによってこれを行いますB
。空のセットがのサブセットではなかった場合、にない空のセットB
の要素を見つけることができましたB
。しかし、空のセットには要素がないため、にない要素を見つけることができませんB
。したがって、空集合がのサブセットではないというわけではありませんB
。したがって、空のセットはのサブセットである必要がありますB
。
すべての文字列は空の文字列で始まります。
まず、で始まるの定義に同意する必要があります。Let s
and t
be string
ss
は、 t
ifs.Length >= t.Length
との最初のt.Length
文字t
がs
。の文字と一致することから始まります。つまり、s.Length >= t.Length
そしてそのInt32 index
ようなすべてについて0 <= index < t.Length
、s[index] == t[index]
は真実です。逆に、我々はそれが言うs
と起動しないt
if文
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 no
Int32 index satisfying
0 <= 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を返します。