Judul adalah keseluruhan pertanyaan. Bisakah seseorang memberi saya alasan mengapa ini terjadi?
Jawaban:
Ya - karena ini dimulai dengan string kosong. Memang, string kosong secara logis terjadi di antara setiap pasangan karakter.
Begini: definisi "dimulai dengan" apa yang dapat Anda berikan yang menghalangi ini? Berikut definisi sederhana dari "dimulai dengan" yang tidak:
"x starts with y if the first y.Length
characters of x match those of y."
An alternative (equivalent) definition:
"x starts with y if x.Substring(0, y.Length).Equals(y)
"
Saya akan coba uraikan apa yang dikatakan Jon Skeet.
Misalkan x, y dan z adalah string dan + operator sebenarnya adalah penggabungan, maka:
Jika kita dapat membagi z menjadi z = x + y itu berarti z dimulai dengan x. Karena setiap string z dapat dipisahkan menjadi z = "" + z maka setiap string dimulai dengan "".
Jadi, karena ("" + "abcd") == "abcd" berarti "abcd" dimulai dengan ""
Saya akan mulai dengan fakta terkait yang lebih mudah dipahami.
Himpunan kosong adalah bagian dari setiap himpunan.
Mengapa? The Definisi dari bagian negara yang A
merupakan bagian dari B
jika setiap elemen dari A
unsur B
. Sebaliknya, A
bukan merupakan bagian dari B
jika ada elemen A
yang bukan merupakan elemen B
.
Sekarang perbaiki satu set B
. Saya akan menetapkan bahwa set kosong adalah bagian dari B
. Saya akan melakukan ini dengan menunjukkan bahwa bukan kasus set kosong bukan bagian dari B
. Jika himpunan kosong bukan bagian dari B
maka saya bisa menemukan elemen dari himpunan kosong yang tidak ada B
. Tetapi himpunan kosong tidak memiliki elemen apa pun dan karenanya saya tidak dapat menemukan elemen yang tidak ada di dalamnya B
. Oleh karena itu, ini tidak terjadi bahwa himpunan kosong bukan merupakan bagian dari B
. Jadi, himpunan kosong harus merupakan bagian dari B
.
Setiap string dimulai dengan string kosong.
Pertama, kita harus menyetujui definisi dimulai dengan . Membiarkan s
dan t
menjadi string
s Kami mengatakan bahwa s
dimulai dengan t
jika s.Length >= t.Length
dan t.Length
karakter pertama t
cocok dengan s
. Artinya, s.Length >= t.Length
dan untuk setiap Int32 index
hal itu 0 <= index < t.Length
, s[index] == t[index]
adalah benar. Sebaliknya, kami akan mengatakan bahwa s
tidak dimulai dengan t
pernyataan if
s.Length < t.Length
atau s.Length >= t.Length
dan ada Int32 index
semacam itu 0 <= index < t.Length
dans[index] != t[index]
adalah benar. Dalam bahasa Inggris sederhana, s
lebih pendek dari t
, atau, jika tidak, ada karakter yang t
tidak cocok dengan karakter yang posisinya sama s
.
Sekarang perbaiki string s
. Saya akan menetapkan itu s
dimulai dengan string kosong. Saya akan melakukan ini dengan menunjukkan bahwa ini bukan kasus yang s
tidak dimulai dengan string kosong. Jika s
tidak dimulai dengan string kosong maka s.Length < String.Empty.Length
atau s.Length >= String.Empty.Length
dan ada Int32 index
semacam itu 0 <= index < String.Empty.Length
. Tetapi s.Length >= 0
dan String.Empty.Length
sama dengan nol sehingga tidak mungkin untuk s.Length < String.Empty.Length
menjadi kenyataan. Demikian pula, karena `` String.Empty.Length is equal to zero, there is no
Int32 index satisfying
0 <= index <String.Empty.Length`. Karena itu
s.Length < String.Empty.Length
atau s.Length >= String.Empty.Length
dan ada Int32 index
semacam itu0 <= index < String.Empty.Length
salah. Oleh karena itu, bukan kasus yang s
tidak dimulai dengan string kosong. Jadi, s
harus dimulai dengan string kosong.
Berikut ini adalah implementasi start dengan kode sebagai perpanjangan dari 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;
}
Dua fakta yang dicetak tebal di atas adalah contoh pernyataan yang benar-benar hampa . Mereka benar berdasarkan fakta bahwa pernyataan yang mendefinisikannya ( subset dan dimulai dengan ) adalah kuantifikasi universal atas alam semesta kosong. Tidak ada elemen di himpunan kosong, jadi tidak boleh ada elemen dari himpunan kosong tidak di himpunan tetap lainnya. Tidak ada karakter di string kosong, jadi tidak boleh ada karakter karena beberapa posisi di string kosong tidak cocok dengan karakter di posisi yang sama di string tetap lainnya.
Metode ini membandingkan parameter nilai ke substring di awal string ini yang sama panjangnya dengan nilai, dan mengembalikan nilai yang menunjukkan apakah sama atau tidak. Agar sama, nilai harus berupa string kosong (Empty), referensi ke instance yang sama ini, atau cocok dengan awal instance ini.
true jika urutan karakter yang diwakili oleh argumen adalah awalan dari urutan karakter yang diwakili oleh string ini; false jika tidak. Perhatikan juga bahwa true akan dikembalikan jika argumennya adalah string kosong atau sama dengan objek String ini sebagaimana ditentukan oleh metode equals (Object).
Anggap saja "abcd".StartsWith("")
return false.
jika demikian maka apa ekspresi berikut ini, benar atau salah:
("abcd".Substring(0,0) == "")
ternyata sama dengan true, sehingga string tersebut dimulai dengan string kosong ;-), atau dengan kata lain, substring "abcd" dimulai dari posisi 0 dan memiliki panjang 0 sama dengan string kosong "". Imo yang cukup logis.
null
akan menjadi nilai pengembalian yang sesuai.
Dalam C # ini adalah bagaimana spesifikasi mengatakan untuk bereaksi;
Agar sama, nilai harus berupa string kosong (Empty), referensi ke instance yang sama ini, atau cocok dengan awal instance ini.
Mengapa "abcd" .StartsWith ("") mengembalikan nilai true?
JAWABAN NYATA:
Harus seperti itu kalau tidak Anda akan memiliki kasus di mana
"".startsWith("") == false
"".equals("") == true
but yet
"a".startsWith("a") == true
"a".equals("a") == true
dan kemudian kami akan memiliki Y2K lagi karena semua perangkat lunak bank yang bergantung pada string yang sama dimulai dengan diri mereka sendiri akan membuat akun kami tercampur dan tiba-tiba Bill Gates akan memiliki kekayaan saya dan saya akan memiliki miliknya, dan sial! Nasib tidak begitu baik bagiku.
Sekadar catatan, secara String.StartsWith()
internal memanggil metode System.Globalization.CultureInfo.IsPrefix()
yang membuat pemeriksaan berikut secara eksplisit:
if (prefix.Length == 0)
{
return true;
}
Jika Anda memikirkannya dalam istilah ekspresi reguler, itu masuk akal. Setiap string (bukan hanya "abcd", juga "" dan "sdf \ nff"), mengembalikan nilai true saat mengevaluasi ekspresi reguler 'dimulai dengan string kosong'.