2010-07-12 28 views
19

Thực hành tốt nhất để chỉ định CurrentCulture hoặc InvariantCulture và không chỉ định văn hóa là gì?Khi nào tôi nên chỉ định CurrentCulture hoặc InvariantCulture và khi nào tôi nên để nó không xác định?

Từ những gì tôi đã đọc, ví dụ, nếu bạn đang thực hiện tuần tự hóa, bạn cần InvariantCulture làm phương tiện chỉ định một biểu diễn chính tắc của một giá trị dữ liệu. Đó là một tỷ lệ tương đối nhỏ của các thao tác chuỗi dựa trên văn hóa.

tôi thấy nó dài, dài dòng, và xấu xí hầu hết thời gian để xác định nó mỗi khi tôi làm, nói:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName); 

Tuy nhiên, nhóm nghiên cứu của tôi gần đây đã biến FxCop trên và bây giờ có một push luôn luôn sử dụng CultureInfo EVERYWHERE. Kỹ thuật tốt nhất để kết hợp ngắn gọn, dễ đọc và chức năng là gì?

Một số tốt các tài liệu đọc:

Trả lời

16

Có một trade-off vốn chơi ở đây.

Tối thiểu, bạn sẽ muốn chỉ định CultureInfo để sử dụng InvariantCulture bất cứ khi nào bạn đang thực hiện bất kỳ nội dung nào bên trong chương trình của mình. Ví dụ, bằng cách sử dụng này với Serialization lực đại diện dữ liệu để luôn luôn giống nhau, vì vậy bạn không phải lo lắng về vấn đề quốc tế hóa với các định dạng dữ liệu nội bộ của bạn.

Điều đó đang được nói, xác định điều này ở khắp mọi nơi có một số lợi thế - chủ yếu là về buộc bạn phải chắc chắn rằng bạn đang xử lý chính xác. Công việc chương trình nội bộ so với công việc giao diện người dùng cần phải có một nền văn hóa khác được chỉ định (miễn là bạn muốn bản địa hóa đúng cách ứng dụng của mình). Kết quả là, một chương trình phức tạp có xu hướng yêu cầu điều này phải được chỉ định ở khắp mọi nơi, như rời khỏi "mặc định" là nguy hiểm nhất, và có xu hướng giới thiệu lỗi theo thời gian.

Tuy nhiên, chỉ định điều này, như bạn thấy, có xu hướng tăng kích thước mã của bạn và có khả năng làm giảm khả năng đọc. Điều này dẫn đến khả năng đọc và duy trì tính thương mại thông qua mã ngắn hơn so với quốc tế hóa và bản địa hóa và bảo trì phù hợp thông qua việc rõ ràng hơn ở mọi nơi.

Theo ý kiến ​​của tôi, không có câu trả lời "đúng" ở đây - nó thực sự phụ thuộc vào đơn đăng ký của bạn. Nếu ứng dụng của bạn hoàn toàn về bản trình bày và không thực hiện nhiều thao tác dữ liệu, đặc biệt là không có bất kỳ loại lưu trữ tệp tự quản lý nào, hãy đặt văn hóa hiện tại (và văn hóa ui) một lần có thể tốt. Tôi đã thấy rằng các ứng dụng phức tạp hơn có xu hướng không hoạt động tốt trong thời trang này, tuy nhiên, trong trường hợp đó, các gợi ý của FxCop về việc xác định điều này ở khắp mọi nơi có vẻ hấp dẫn hơn.

+1

@Reed Copsey: Tôi cũng thấy rằng việc thêm nó ở mọi nơi khi phản xạ FxCop tạo ra lỗi - nhiều lần tôi đã thấy các trường hợp tùy chọn văn hóa sai được chỉ định. Điều này rõ ràng chỉ là một vấn đề giáo dục, nhưng là một sự xuất hiện phổ biến khi một cái gì đó như FxCop nói với bạn để làm những việc nhưng bạn không nhất thiết phải hiểu tại sao. –

+2

@Scott: Đúng vậy. Nhưng đây là trường hợp với tất cả mọi thứ trong lập trình - nếu bạn sẽ sử dụng nó, bạn cần phải hiểu nó hoặc nó sẽ cắn bạn. Cách duy nhất để làm nội địa hóa là xem xét nó khi bạn lần đầu tiên viết mã - bản địa hóa một sản phẩm hoàn chỉnh là một trong những công việc tồi tệ nhất để làm, và một thứ tự cường độ đắt hơn suy nghĩ về nó ngay từ đầu. –

+0

Tôi không đồng ý. Tôi có nên đặt văn hóa trong tất cả ToString() của các lớp học của tôi không? Tôi nghĩ rằng logic và các đối tượng nên không biết về văn hóa. – onof

5

Mặc định đã là nền văn hóa hiện tại như được khởi tạo bởi Windows. Vì vậy, việc sử dụng CultureInfo.CurrentCulture rõ ràng chỉ là một sự lãng phí thời gian. Bất kỳ định dạng serialization phong nha (bao gồm serialization nhị phân và serialization XML) sẽ serialize một DateTime trong một cách bất biến văn hóa.

Sử dụng văn hóa không phải là mặc định rất nguy hiểm. Một chuỗi sẽ luôn được bắt đầu bằng văn bản mặc định theo quy định của Windows và được cấu hình bởi người dùng khi cài đặt Windows. .NET bắt đầu threadpool thread tất cả các thời gian và bạn sẽ có nguy cơ nhận được một nền văn hóa trong chủ đề đó là khác nhau từ chủ đề chính của bạn. Mà có thể gây ra tất cả các cách của các vấn đề tinh tế. Giống như có một SortedList đột nhiên không được sắp xếp nữa.

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