Văn hóa bất biến là gì?


173

Bất cứ ai cũng có thể đưa ra một ví dụ để chứng minh việc sử dụng Văn hóa bất biến ? Tôi không hiểu những gì tài liệu mô tả.


14
Đó là tiếng Anh, nhưng không liên quan đến bất kỳ vị trí nào.

Câu trả lời:


132

Văn hóa bất biến là một nền văn hóa đặc biệt hữu ích vì nó sẽ không thay đổi. Văn hóa hiện tại có thể thay đổi từ người dùng này sang người dùng khác hoặc thậm chí từ người này sang người khác, vì vậy bạn không thể dựa vào đó để giữ nguyên.

Có thể sử dụng cùng một nền văn hóa mỗi lần là rất quan trọng trong một số luồng, ví dụ, tuần tự hóa: bạn có thể có 1,1 giá trị trong một nền văn hóa và 1,1 trong một nền văn hóa khác. Nếu bạn sẽ cố phân tích giá trị "1,1" trong văn hóa thứ hai, thì việc phân tích cú pháp sẽ thất bại. Tuy nhiên, bạn có thể sử dụng văn hóa bất biến để chuyển đổi một số thành một chuỗi và sau đó phân tích lại từ bất kỳ máy tính nào với bất kỳ tập văn hóa nào.

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);

9
Đối với những gì nó có giá trị, đây là trong System.Globalizationkhông gian tên.
Jim H.

1
Điều này sẽ luôn hoạt động vì bạn nối tiếp với cùng một nền văn hóa << điều này không có ý nghĩa với tôi, tôi nghĩ rằng tôi đã hiểu nhầm điều gì đó. Nếu sử dụng CultureInfo.InvariantCulturecác tác phẩm vì bạn đã tuần tự hóa cùng một nền văn hóa .... thì nó có giống như sử dụng CultureInfo.CurrentCulturekhông?
Alisson

3
@Alisson Nếu bạn đặt hai câu lệnh mã cuối cùng của Andrew trở lại luồng ban đầu, tôi nghĩ nó sẽ có ý nghĩa hơn. Nếu bạn luôn tuần tự hóa bằng cách sử dụng CultureInfo.InvariantCulturethì bạn biết rằng bạn sẽ luôn có thể phân tích lại thành số thập phân bằng cách sử dụng CultureInfo.InvariantCulture. Nếu bạn sử dụng CultureInfo.CurrentCultuređể tuần tự hóa, người dùng của bạn có thể có "en-US" như văn hóa hiện tại của họ. Người dùng tiếp theo phân tích lại thành số thập phân có thể có văn hóa hiện tại sử dụng "," cho dấu phân cách.
David Specht

1
@Andrew Có lẽ tôi dày đặc, nhưng tôi không thể hiểu những gì bạn đang nói, mà không có nhận xét của David. Tôi chỉnh sửa câu trả lời của bạn để được rõ ràng.
jpaugh

111

Một nền văn hóa giả dựa trên tiếng Anh với hành vi được xác định. Tuyệt vời để viết ra, ví dụ, nhét vào các tệp cấu hình để có thể đọc và ghi bất kể văn hóa mà người dùng đã xác định.

Về cơ bản đó là một nền văn hóa cụ thể là giả tạo và sẽ không thay đổi .


4
Cụ thể, bạn sẽ không bị bắt gặp bởi các cách sử dụng dấu phẩy và điểm khác nhau trong các dạng chuỗi số hoặc với các chuyển đổi trường hợp kỳ lạ.
Steve Gilham

8
Yesss ... vấn đề điển hình cho: * Các lập trình viên người Mỹ nghĩ rằng từ này là tiếng Anh;) Và sau đó khách hàng Đức viết 1.000,00 cho 1000;) Ouch. * Ngay cả trong cùng một ngôn ngữ, ví dụ Thụy Sĩ và Đức sử dụng "." và "," theo những cách khác nhau về số lượng. Kết quả -> Tập tin cấu hình là rác. Sử dụng Ngôn ngữ bất biến ở đó;)
TomTom

23
Để thêm vào nhận xét của Steve: đó là văn hóa nên sử dụng khi bạn không thực sự quan tâm mọi thứ trông như thế nào (bạn không quan tâm liệu nó sử dụng dấu phẩy hay điểm hay bất cứ điều gì, bởi vì người dùng sẽ không bao giờ nhìn thấy nó) nhưng bạn luôn cần nó giống nhau (ví dụ vì bạn cần có khả năng đọc những gì bạn đã viết).
itowlson

7

Nó được sử dụng cho những thứ giống nhau bất kể văn hóa (không cần dịch sang văn hóa X nào đó cho phù hợp)

như một ví dụ - https://msdn.microsoft.com/en-us/l Library / 4c5zdc6a (v = vs.100) .aspx . Khi bạn viết ra một tệp dành riêng cho ứng dụng mà người dùng không nên loay hoay, bạn nên sử dụng InvariantCARM cho tất cả các phương thức có tham số văn hóa.

Lưu ý rằng theo các tài liệu được liên kết ở trên:

Tuy nhiên, một ứng dụng chỉ nên sử dụng văn hóa bất biến cho các quy trình yêu cầu kết quả độc lập với văn hóa, chẳng hạn như định dạng và phân tích dữ liệu được duy trì trong một tệp.


3
Điều này nói lên một hệ quả rằng Văn hóa bất biến chỉ nhằm mục đích là một định dạng trung gian, tức là nếu bạn đang hiển thị nội dung cho người dùng là đầu ra của văn hóa bất biến (nghĩa là 'trong' văn ​​hóa bất biến), bạn đang làm một cái gì đó sai và không hiểu văn hóa bất biến.
mlhDev

3

Văn hóa bất biến là văn hóa vô cảm; nó được liên kết với ngôn ngữ tiếng Anh nhưng không liên quan đến bất kỳ quốc gia / khu vực nào.

CultureInfo.InvariantCARM lấy một thể hiện của văn hóa bất biến. Nó có thể được sử dụng trong hầu hết mọi phương thức trong không gian tên System.Globalization đòi hỏi phải có văn hóa.

Các đối tượng được trả về bởi các thuộc tính như so sánhInfo, DateTimeFormat và NumberFormat cũng phản ánh các quy ước so sánh chuỗi và định dạng của văn hóa bất biến. Thuộc tính InvariantCARM có ích khi bạn muốn hiển thị dữ liệu bền vững ở định dạng độc lập với văn hóa .

Chẳng hạn, nếu bạn muốn hiển thị một số hoặc datetime theo định dạng cụ thể độc lập với văn hóa hiện tại của ứng dụng, bạn có thể sử dụng CultureInfo.InvariantCARM .


0

Nó là một ngôn ngữ tiếng Anh đơn giản không theo vùng cụ thể và các thông tin liên quan khác. Nó giống như ngôn ngữ của chính ngôn ngữ lập trình. Bạn có thể dựa vào nó trong việc thiết lập một lịch phổ quát; trong trường hợp bạn cần tạo tên bộ điều khiển, tên URL, tên đại biểu ... vv. và cần mọi thứ để hành động tự nhiên và phổ biến trong số tất cả người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.