2009-01-06 50 views
28

Khi làm một so sánh chuỗi trong C#, sự khác biệt giữa làm mộtC so sánh # String: Sự khác nhau giữa CurrentCultureIgnoreCase và InvariantCultureIgnoreCase

string test = "testvalue"; 
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase); 

string test = "testvalue"; 
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase); 

là gì ... và là điều quan trọng để bao gồm thông số bổ sung đó, dù sao?

Trả lời

24

Microsoft đưa ra một số hướng dẫn đàng hoàng cho khi sử dụng tài sản InvariantCulture:

MSDN: CultureInfo.InvariantCulture Property

... một ứng dụng nên sử dụng văn hóa bất biến chỉ cho các quá trình đòi hỏi nền văn hóa độc lập kết quả , chẳng hạn như định dạng và dữ liệu phân tích cú pháp được lưu giữ thành tệp . Trong các trường hợp khác, nó tạo ra kết quả có thể theo ngôn ngữ không chính xác hoặc không phù hợp về mặt văn hóa.

cân nhắc an ninh

Nếu một quyết định an ninh sẽ được thực hiện dựa trên kết quả của một chuỗi so sánh hoặc trường hợp thay đổi, ứng dụng của bạn nên sử dụng một so sánh thứ tự mà bỏ qua trường hợp thay vì của việc sử dụng InvariantCulture . [...]

Chuỗi hoạt động

Nếu ứng dụng của bạn cần phải thực hiện một chuỗi hoạt động văn hóa nhạy cảm mà không bị ảnh hưởng bởi giá trị của CurrentCulture, cần sử dụng một phương pháp chấp nhận một tham số CultureInfo. [...]

kiên trì dữ liệu

Thuộc tính InvariantCulture là hữu ích để lưu trữ dữ liệu đó sẽ không được hiển thị trực tiếp cho người dùng. Lưu trữ dữ liệu theo định dạng không độc lập về văn hóa đảm bảo định dạng đã biết rằng không thay đổi. Khi người dùng từ nền văn hóa khác nhau truy cập dữ liệu, nó có thể được định dạng phù hợp dựa trên trên người dùng cụ thể. [...]

26

Các bài viết khác đã đưa ra lời khuyên tốt, nhưng tôi nghĩ nó có thể là tốt đẹp để hiển thị một ví dụ về nơi nó chắc chắn làm cho một sự khác biệt:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr"); 
     Thread.CurrentThread.CurrentCulture = turkish;     

     // In Turkey, "i" does odd things 
     string lower = "i"; 
     string upper = "I"; 

     Console.WriteLine(lower.Equals(upper, 
      StringComparison.CurrentCultureIgnoreCase)); 
     Console.WriteLine(lower.Equals(upper, 
      StringComparison.InvariantCultureIgnoreCase)); 
    } 
} 

(Không có nghi ngờ nhiều trường hợp khác - đây chỉ là trường hợp đầu tiên tôi nghĩ đến.)

+4

Vâng, tiếng Thổ Nhĩ Kỳ là một trường hợp đặc biệt. Chúng có chữ thường không có dấu chấm "ı" với chữ hoa "I" và chữ thường "i" có chữ hoa "İ". Nó được coi là trường hợp kinh điển cho sự khác biệt về văn hóa. – configurator

+3

Để biết thêm về bản chất của tiếng Thổ Nhĩ Kỳ như là "trường hợp kinh điển" được đề cập bởi trình cấu hình, hãy xem: http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html – JeffH

+0

Tôi đã gặp điều tương tự trong tiếng Việt 'String.Compare (" logid "," logId ", StringComparison.CurrentCultureIgnoreCase) == 1'. Nhưng 'String.Compare (" id "," Id ", StringComparison.CurrentCultureIgnoreCase) == 0': O –

Các vấn đề liên quan