C# CultureInfo之常用InvariantCulture案例详解
1、cultureinfo的invariantculture的作用
(1)、cultureinfo使整个.net framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户。但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“机器”看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是invariantculture的用武之地。
(2)、当进行数字,日期时间,字符串匹配时,都会进行cultureinfo的操作,也就是不同的cultureinfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视invariantculture。
2、使用场景
你编写一个程序,要向数据中心服务器传递一些时间数据,你会怎么写?直接datetime.tostring()?那你就大错特错了,下面用代码,举个非常形象的例子。在一个控制台里,模拟数据中心,然后放出多个线程,模拟客户端程序传递数据。
static readonly string[] culturesources = { "en-us", "zh-cn", "ar-iq", "de-de" }; static readonly random ran = new random(environment.tickcount); static void main() { console.writeline("数据中心开始接受客户端数据:"); for (int i = 0; i < culturesources.length; i++) threadpool.queueuserworkitem(client, i); console.readkey(true); console.writeline(""); console.writeline("数据中心:…………"); } static void client(object obj) { int id = (int)obj; thread.sleep(ran.next(1000)); cultureinfo cul = cultureinfo.getcultureinfo(culturesources[id]); thread.currentthread.currentculture = cul; console.writeline("某客户端操作系统语言设置{0}\n传送数据:{1}\n", cul.displayname, new datetime(1990, 10, 27).toshortdatestring()); }
同样的datetime.toshortdatestring(),在英语-美国,中文-中国,阿拉伯语-伊拉克和德语-德国的不同环境下,1990年10月27日竟然有如此不同的输出结果,这些数据让数据中心服务器情何以堪啊!!!
造成这个情况的原因是:在进行日期时间输出时,.net会考虑当前线程的cultureinfo,即thread.currentthread.currentculture(或者cultureinfo.currentculture),并根据cultureinfo,进行相应地区文化的数据处理。注意不要和uiculture混淆。
解决方案就是使用这个特殊的invariantculture.解决代码如下:
console.writeline("某客户端操作系统语言设置{0}\n传送数据:{1}\n", cul.displayname, new datetime(1990, 10, 27).tostring(cultureinfo.invariantculture.datetimeformat.shortdatepattern, cultureinfo.invariantculture));
ok,这样不管客户端运行在什么语言环境下,输出的时间格式都是统一的,方面数据中心服务器对数据做后续处理。这样所有的输出结果都保持一致了。
到此这篇关于c# cultureinfo之常用invariantculture案例详解的文章就介绍到这了,更多相关c# cultureinfo之常用invariantculture内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!