string.ToLower () dan string.ToLowerInvariant ()

163

Apa bedanya dan kapan menggunakan apa? Apa risikonya jika saya selalu menggunakan ToLower()dan apa risikonya jika saya selalu menggunakan ToLowerInvariant()?

Louis Rhys
sumber
4
Mungkin Anda harus menormalisasi string menjadi huruf besar. Lihat msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Jawaban:

148

Bergantung pada budaya saat ini, ToLower mungkin menghasilkan huruf kecil khusus budaya, yang tidak Anda harapkan. Seperti memproduksi ınfotanpa titik pada i dan bukannya infodan dengan demikian mengumpulkan perbandingan string. Untuk alasan itu, ToLowerInvariant harus digunakan pada data khusus non-bahasa. Ketika Anda mungkin memiliki input pengguna yang mungkin dalam bahasa asli / karakter-set, umumnya akan menjadi satu-satunya saat Anda menggunakan ToLower.

Lihat pertanyaan ini untuk contoh masalah ini: C # - ToLower () terkadang menghapus titik dari huruf "I"

AaronLS
sumber
45

Saya pikir ini bisa bermanfaat:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

memperbarui

Jika aplikasi Anda bergantung pada kasus string yang berubah dengan cara yang dapat diprediksi yang tidak terpengaruh oleh budaya saat ini, gunakan metode ToLowerInvariant. Metode ToLowerInvariant setara dengan ToLower (CultureInfo.InvariantCulture). Metode ini direkomendasikan ketika kumpulan string harus muncul dalam urutan yang dapat diprediksi dalam kontrol antarmuka pengguna.

juga

... ToLower sangat mirip di sebagian besar tempat dengan ToLowerInvariant. Dokumen-dokumen menunjukkan bahwa metode ini hanya akan mengubah perilaku dengan budaya Turki. Juga, pada sistem Windows, sistem file case-insensitive, yang selanjutnya membatasi penggunaannya ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth

danyolgiax
sumber
@danyolgiax Bisakah Anda menjelaskan lebih lanjut? tidak dapat menyimpulkan kegunaannya dari tautan msdn. Terima kasih
Prerak K
2
ya ToLowerInvariant tidak bekerja di Turki seperti yang diharapkan. İ menjadi ı
MonsterMMORPG
28

String.ToLower()menggunakan budaya default saat String.ToLowerInvariant()menggunakan budaya invarian. Jadi Anda pada dasarnya menanyakan perbedaan antara budaya invarian dan perbandingan string ordinal .

Cheng Chen
sumber
Bukan dia. "Ordinal" adalah opsi ketiga - cara yang sedikit berbeda untuk "mengabaikan" budaya saat ini. Perbedaannya tidak relevan dalam membahas ToLowervarian; Ordinal vs invariant hanya mengubah "urutan" dari dua string, tidak mengubah perbandingan kesetaraan.
ToolmakerSteve
27

TL; DR:

Ketika bekerja dengan "konten" (misalnya artikel, posting, komentar, nama, tempat, dll.) Gunakan ToLower(). Saat bekerja dengan "literal" (mis. Argumen baris perintah, tata bahasa khusus, string yang seharusnya enum, dll.) GunakanToLowerInvariant() .

Contoh:

= Menggunakan ToLowerInvariantsalah =

Di Turki, DIŞberarti "di luar" dan dişberarti "gigi". Casing bawah yang tepat DIŞadalah dış. Jadi, jika Anda menggunakan ToLowerInvariantsalah Anda mungkin memiliki kesalahan ketik di Turki.

= Menggunakan ToLowersalah =

Sekarang berpura-pura Anda sedang menulis parser SQL. Di suatu tempat Anda akan memiliki kode yang terlihat seperti:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

Tata bahasa SQL tidak berubah ketika Anda mengubah budaya. Sebuah Prancis tidak menulis SÉLECTIONNEZ x DE booksbukan SELECT X FROM books. Namun, agar kode di atas berfungsi, orang Turki harus menulis SELECT x FROM books WHERE Author LİKE '%Adams%'(perhatikan titik di atas ibukota saya, hampir mustahil untuk dilihat). Ini akan membuat frustasi bagi pengguna Turki Anda.

Kecepatan
sumber