Ben böyle bir kod var:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Davayı umursamıyorum. Ben kullanmalı mıyım OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ya CurrentCultureIgnoreCase
?
Ben böyle bir kod var:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Davayı umursamıyorum. Ben kullanmalı mıyım OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ya CurrentCultureIgnoreCase
?
Yanıtlar:
MSDN'den " Microsoft .NET 2.0'da Dizeleri Kullanmak için Yeni Öneriler "
Özet: Daha önce
InvariantCulture
dize karşılaştırma, kasa ve sıralama için kullanılan kod sahipleriString
, Microsoft .NET 2.0'da yeni bir aşırı yükler kümesi kullanmayı düşünmelidir . Spesifik olarak, kültüre karşı agnostik ve dilsel olarak alakasız olacak şekilde tasarlanan veriler , yeni numaralandırmanın yaStringComparison.Ordinal
daStringComparison.OrdinalIgnoreCase
üyelerini kullanarak aşırı yükleri belirlemeye başlamalıdırStringComparison
. Bunlar, benzer bir bayt-byte karşılaştırmasınıstrcmp
zorunlu kılar, sadece hataların temel olarak sembolik dizelerin dilsel yorumundan kaçınmakla kalmaz, aynı zamanda daha iyi performans sağlar.
"Straße"
ve "STRASSE"
. Kullanırken döner , oysa onlar eşit olduğunu söylüyor. OrdinalIgnoreCase
Equals
false
InvariantCultureIgnoreCase
Unicode dizelerini karşılaştırmak zordur:
Metin işleme yazılımında Unicode string aramalarının ve karşılaştırmalarının uygulanması, eşdeğer kod noktalarının varlığını dikkate almalıdır. Bu özelliğin yokluğunda, belirli bir kod noktası dizisini arayan kullanıcılar, farklı ancak kanonik olarak eşdeğer bir kod noktası gösterimine sahip, görsel olarak ayırt edilemeyen diğer glifleri bulamazlar.
bkz. http://en.wikipedia.org/wiki/Unicode_equivalence
2 unicode dizeyi büyük / küçük harfe duyarlı olmayan bir şekilde karşılaştırmaya çalışıyorsanız ve HER YERDE çalışmasını istiyorsanız, imkansız bir sorununuz var demektir.
Klasik örnek Türkçe i , üst harfli olduğunda İ olur (noktayı fark eder)
Varsayılan olarak, .Net çerçevesi sıralı (bayt bayt) karşılaştırma kullanan çok önemli bir istisna dışında, dize ile ilgili işlevler için CurrentCulture'u.Equals
kullanır.
Bu, tasarım gereği, bilgisayarın kültürüne bağlı olarak farklı davranan çeşitli dize işlevlerine yol açar.
Bununla birlikte, bazen "genel amaçlı", büyük / küçük harfe duyarlı olmayan bir karşılaştırma istiyoruz.
Örneğin, uygulamanızın yüklü olduğu bilgisayar ne olursa olsun dize karşılaştırmanızın aynı şekilde davranmasını isteyebilirsiniz.
Bunu başarmak için 3 seçeneğimiz var:
Unicode denklik kuralları karmaşıktır, yani yöntem 1) veya 2) 'nin kullanılması daha pahalıdır OrdinalIgnoreCase
. Aslında OrdinalIgnoreCase
herhangi bir özel unicode normalleşmesini, bir bilgisayar ekranında aynı şekilde işlemek bazı dizeleri, araçlara gerçekleştirmez olmaz özdeş kabul. Örneğin: "\u0061\u030a"
ve "\u00e5"
her ikisi de å. Ancak sıralı karşılaştırmada farklı kabul edilecektir.
Hangisini çok fazla tercih edeceğiniz, yaptığınız uygulamaya bağlıdır.
Microsoft, açık yönergelerle kendi önerilerine sahiptir. Bununla birlikte, bu sorunlara yaklaşmadan önce unicode denklik kavramını anlamak gerçekten önemlidir.
Ayrıca, OrdinalIgnoreCase'in çok özel bir canavar türü olduğunu unutmayın , bu da bazı sözlükbilimsel yönlerde karışık olanlarla karşılaştırmak ve biraz sıralı bir seçim yapmaktır . Bu kafa karıştırıcı olabilir.
Ne istediğinize bağlı, ancak çok değişmedikçe değişmez kültürden çekindim emin diğer diller için kod yerelleştirilmesine istemeyeceksiniz. Bunun yerine CurrentCulture kullanın.
Ayrıca, OrdinalIgnoreCase, istediğiniz gibi olabilecek veya olmayabilecek sayılara saygı göstermelidir.
Çok basit cevap, Türkçe kullanmadığınız sürece InvariantCulture kullanmanıza gerek yok.
Aşağıdaki bağlantıya bakın:
C # 'da ToUpper () ve ToUpperInvariant () arasındaki fark nedir?