Jaka jest różnica i kiedy czego użyć? Jakie jest ryzyko, jeśli zawsze używam ToLower()i jakie jest ryzyko, jeśli zawsze używam ToLowerInvariant()?
Jaka jest różnica i kiedy czego użyć? Jakie jest ryzyko, jeśli zawsze używam ToLower()i jakie jest ryzyko, jeśli zawsze używam ToLowerInvariant()?
Odpowiedzi:
W zależności od bieżącej kultury ToLower może wygenerować małą literę specyficzną dla kultury, której nie oczekujesz. Takich jak tworzenie ınfobez kropki na i zamiast, infoa tym samym zakłócanie porównań ciągów. Z tego powodu ToLowerInvariant powinien być używany w przypadku wszelkich danych niespecyficznych dla języka. Gdy możesz mieć dane wejściowe użytkownika, które mogą być w ich rodzimym języku / zestawie znaków, na ogół byłby to jedyny przypadek, w którym używasz ToLower.
Zobacz to pytanie, aby zapoznać się z przykładem tego problemu: C # - ToLower () czasami usuwa kropkę z litery „I”
Myślę, że może to być przydatne:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
aktualizacja
Jeśli aplikacja zależy od przypadku zmiany ciągu w przewidywalny sposób, na który nie ma wpływu bieżąca kultura, użyj metody ToLowerInvariant. Metoda ToLowerInvariant jest równoważna z ToLower (CultureInfo.InvariantCulture). Metoda jest zalecana, gdy kolekcja ciągów musi pojawiać się w przewidywalnej kolejności w kontrolce interfejsu użytkownika.
również
... ToLower jest bardzo podobne w większości miejsc do ToLowerInvariant. Z dokumentów wynika, że metody te zmienią zachowanie tylko w przypadku kultur tureckich. Ponadto w systemach Windows system plików nie rozróżnia wielkości liter, co dodatkowo ogranicza jego użycie ...
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
String.ToLower()używa domyślnej kultury, podczas gdy String.ToLowerInvariant()używa niezmiennej kultury. Więc zasadniczo pytasz o różnice między niezmienną kulturą a porządkową porównaniem ciągów .
ToLowerwariantów; Porządkowy kontra niezmiennik po prostu zmienia „porządek sortowania” dwóch ciągów, nie zmienia porównania równości.
TL; DR:
Podczas pracy z „treścią” (np. Artykuły, posty, komentarze, nazwiska, miejsca itp.) Używaj ToLower(). Podczas pracy z "literałami" (np. Argumentami wiersza poleceń, niestandardowymi gramatykami, napisami, które powinny być wyliczeniami, itp.) Użyj ToLowerInvariant().
Przykłady:
= Nieprawidłowe użycieToLowerInvariant =
W języku tureckim DIŞoznacza „na zewnątrz” i diş„ząb”. Właściwa dolna obudowa DIŞjest dış. Tak więc, jeśli użyjesz ToLowerInvariantnieprawidłowo, możesz mieć literówki w Turcji.
= Nieprawidłowe użycieToLower =
Teraz udawaj, że piszesz parser SQL. Gdzieś będziesz miał kod, który wygląda tak:
if(operator.ToLower() == "like")
{
// Handle an SQL LIKE operator
}
Gramatyka SQL nie zmienia się po zmianie kultur. Francuz nie pisze SÉLECTIONNEZ x DE bookszamiast SELECT X FROM books. Jednak aby powyższy kod działał, osoba z Turcji musiałaby pisać SELECT x FROM books WHERE Author LİKE '%Adams%'(zwróć uwagę na kropkę nad wielką literą i, prawie niemożliwe do zobaczenia). Byłoby to dość frustrujące dla tureckiego użytkownika.