タイトルは質問全体です。誰かが私にこれが起こる理由を教えてもらえますか?
はい-空の文字列で始まるためです。実際、空の文字列は論理的にすべての文字のペアの間で発生します。
このように言います。これを排除するために、「で始まる」のどのような定義を与えることができますか?これは、「ではない」の単純な定義で、次のようなものはありません。
「xの最初の_y.Length
_文字がyの文字と一致する場合、xはyで始まります。」
別の(同等の)定義:
「x.Substring(0, y.Length).Equals(y)
の場合、xはyで始まります」
ジョン・スキートの発言について詳しく説明します。
X、y、zが文字列で、+演算子が実際に連結されているとします。
Zを分割してz = x + yと書くことができる場合、zはxで始まることを意味します。すべての文字列zはz = "" + zに分割できるため、すべての文字列は ""で始まります。
したがって、( "" + "abcd")== "abcd"なので、 "abcd"は ""で始まることになります。
このメソッドは、値パラメーターをこの文字列の先頭にある、値と同じ長さの部分文字列と比較し、それらが等しいかどうかを示す値を返します。 等しい場合、値は空の文字列(Empty)、この同じインスタンスへの参照、またはこのインスタンスの先頭と一致する必要があります。
引数によって表される文字シーケンスがこの文字列によって表される文字シーケンスの接頭辞である場合はtrue。それ以外の場合はfalse。 また、引数が空の文字列であるか、equals(Object)メソッドで決定されたこのStringオブジェクトと等しい場合、trueが返されることにも注意してください。
理解しやすい関連事実から始めましょう。
空のセットはすべてのセットのサブセットです。
どうして? definition ofsubsetは、A
のすべての要素がB
の要素である場合、A
はB
のサブセットであることを示します。逆に、A
の要素ではないB
の要素がある場合、A
はB
のサブセットではありません。
次に、セットB
を修正します。空のセットがB
のサブセットであることを確認します。空のセットがB
のサブセットではないことを示すことで、これを行います。空のセットがB
のサブセットでない場合、B
にない空のセットの要素を見つけることができます。しかし、空のセットには要素がないため、B
にない要素を見つけることができません。したがって、空のセットがB
のサブセットではないというわけではありません。したがって、空のセットはB
のサブセットである必要があります。
すべての文字列は空の文字列で始まります。
最初に、の定義がで始まることに同意する必要があります。 s
とt
をstring
sとしましょうs
はt
if s.Length >= t.Length
で始まり、t
の最初のt.Length
文字がs
の文字と一致すると言います。つまり、s.Length >= t.Length
、およびInt32 index
が0 <= index < t.Length
となるようなすべてのs[index] == t[index]
についてはtrueです。逆に、次のステートメントの場合、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 <= index < String.Empty.Length
になります。ただし、s.Length >= 0
およびString.Empty.Length
はゼロに等しいため、s.Length < String.Empty.Length
がtrueになることは不可能です。同様に、「String.Empty.Lengthis equal to zero, there is no
Int32 indexsatisfying
0 <= index <String.Empty.Length`。したがって
s.Length < String.Empty.Length
またはs.Length >= String.Empty.Length
およびInt32 index
があり、0 <= index < String.Empty.Length
は偽です。したがって、s
が空の文字列で始まっていないわけではありません。したがって、s
は空の文字列で始まる必要があります。
以下は、string
の拡張としてコーディングされたstarts withの実装です。
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つの太字のファクトは 虚偽のステートメント の例です。それらを定義するステートメント(subsetおよびstarts with)は niversal quantifications 空のユニバース。空のセットには要素がないため、他の固定セットにない空のセットの要素は存在できません。空の文字列には文字がないため、空の文字列の一部の位置が他の固定文字列の同じ位置の文字と一致しないため、文字を含めることができません。
"abcd".StartsWith("")
がfalseを返すとしましょう。
もしそうなら、次の式は真または偽に何を評価しますか:
("abcd".Substring(0,0) == "")
evalがtrueであることがわかります。したがって、文字列は空の文字列で始まります;-)、つまり、「abcd」の部分文字列は、位置0から始まり、長さが0であり、空の文字列「」と等しくなります。かなり論理的なイモ。
C#では、これが 指定 が反応するように指示する方法です。
等しい場合、値は空の文字列(Empty)、この同じインスタンスへの参照、またはこのインスタンスの先頭と一致する必要があります。
「abcd」.StartsWith(「」)がtrueを返す理由
実際の答え:
そうでなければ、そうでなければあなたはケースを持っているでしょう
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
それから、Y2Kを繰り返します。なぜなら、同じ文字列に依存するすべての銀行のソフトウェアがアカウントを混乱させ、突然、Bill Gatesが私の財産を手に入れ、私はそれを手に入れるからです。運命は私にはそんなに親切ではありません。
記録のためだけに、String.StartsWith()
は内部でメソッドSystem.Globalization.CultureInfo.IsPrefix()
を呼び出し、次のチェックを明示的に行います。
if (prefix.Length == 0)
{
return true;
}
2つの文字列の最初のN文字は同一です。 Nは2番目の文字列の長さ、つまりゼロ。
文字列は「何もない」で始まるからです。
正規表現で考えると理にかなっています。すべての文字列(「abcd」だけでなく、「」と「sdf\nff」)は、「空の文字列で始まる」の正規表現を評価するとtrueを返します。