Mengapa "abcd" .StartsWith ("") mengembalikan nilai true?

88

Judul adalah keseluruhan pertanyaan. Bisakah seseorang memberi saya alasan mengapa ini terjadi?

Dested
sumber

Jawaban:

164

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)"

Jon Skeet
sumber
3
x dimulai dengan y jika x. Substring (0, y.Length). Sama dengan (y) jika dan hanya jika y.Length> 0
Vinko Vrsalovic
8
Yup, Anda memang bisa mengecualikan kasus ini secara eksplisit. Itu definisi yang sangat tidak elegan, bukan?
Jon Skeet
7
Benar. Itu juga mengharuskan mereka untuk menjadi non-null, juga ... tapi saya akan mengatakan keduanya menambah akurasi sambil menghilangkan semangat definisi sederhana :)
Jon Skeet
8
Kemunculan tak terbatas dari string kosong terjadi di antara setiap pasangan karakter.
Lotus Notes
3
Ya, ini seperti meletakkan nol sebelum sebuah angka - Itu tidak mengubah nilainya namun masih ada.
pop850
47

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 ""

pero
sumber
18

Saya akan mulai dengan fakta terkait yang lebih mudah dipahami.

Himpunan kosong adalah bagian dari setiap himpunan.

Mengapa? The Definisi dari bagian negara yang Amerupakan bagian dari Bjika setiap elemen dari Aunsur B. Sebaliknya, Abukan merupakan bagian dari Bjika ada elemen Ayang 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 Bmaka 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 sdan tmenjadi strings Kami mengatakan bahwa s dimulai dengan t jika s.Length >= t.Lengthdan t.Lengthkarakter pertama tcocok dengan s. Artinya, s.Length >= t.Lengthdan untuk setiap Int32 indexhal itu 0 <= index < t.Length, s[index] == t[index]adalah benar. Sebaliknya, kami akan mengatakan bahwa stidak dimulai dengan tpernyataan if

s.Length < t.Lengthatau s.Length >= t.Lengthdan ada Int32 indexsemacam itu 0 <= index < t.Lengthdans[index] != t[index]

adalah benar. Dalam bahasa Inggris sederhana, slebih pendek dari t, atau, jika tidak, ada karakter yang ttidak cocok dengan karakter yang posisinya sama s.

Sekarang perbaiki string s. Saya akan menetapkan itu sdimulai dengan string kosong. Saya akan melakukan ini dengan menunjukkan bahwa ini bukan kasus yang stidak dimulai dengan string kosong. Jika stidak dimulai dengan string kosong maka s.Length < String.Empty.Lengthatau s.Length >= String.Empty.Lengthdan ada Int32 indexsemacam itu 0 <= index < String.Empty.Length. Tetapi s.Length >= 0dan String.Empty.Lengthsama dengan nol sehingga tidak mungkin untuk s.Length < String.Empty.Lengthmenjadi kenyataan. Demikian pula, karena `` String.Empty.Length is equal to zero, there is noInt32 index satisfying0 <= index <String.Empty.Length`. Karena itu

s.Length < String.Empty.Lengthatau s.Length >= String.Empty.Lengthdan ada Int32 indexsemacam itu0 <= index < String.Empty.Length

salah. Oleh karena itu, bukan kasus yang stidak dimulai dengan string kosong. Jadi, sharus 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.

jason
sumber
17

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.

.NET String.StartsWith

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).

Java String.startsWith

Firas Assaad
sumber
13

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.

Pop Catalin
sumber
Fakta bahwa "abcd" .Substring (0, 0) mengembalikan string kosong tidak berarti bahwa "abcd" sebenarnya dimulai dengan string kosong. Hasilnya mungkin juga telah dinyatakan 'tidak ditentukan', karena nullakan menjadi nilai pengembalian yang sesuai.
Tom Lint
@TomLint Tidak. Anda biasanya menggabungkan kondisi IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) .... Ini membuat kondisi berfungsi bahkan jika salah satu valeus yang dimasukkan adalah string kosong.
Pop Catalin
7

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.

blowdart
sumber
5

Karakter N pertama dari dua string identik. N adalah panjang string kedua, yaitu nol.

Muntah
sumber
5

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.

pengguna804965
sumber
Saya tidak setuju. "" .startsWith ("") harus sama dengan true, karena stringnya identik, dan bukan karena beberapa logika bisnis yang aneh.
Tom Lint
@TomLint Anda sebenarnya setuju dengan pernyataan dalam jawaban ...
neonblitzer
4

Sekadar catatan, secara String.StartsWith()internal memanggil metode System.Globalization.CultureInfo.IsPrefix()yang membuat pemeriksaan berikut secara eksplisit:

if (prefix.Length == 0)
{
    return true;
}
Tamas Czinege
sumber
1

Karena string dimulai dengan baik dengan "nothing".

alat
sumber
1
... itu jika string.empty bukan apa-apa! Penyederhanaan yang berlebihan ini tidak dapat digeneralisasikan. Saya menyarankan agar kita mengikuti diskusi yang lebih berorientasi pada teori.
Pita.O
1

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'.


sumber