CultureInfo.CurrentCulture与Thread.CurrentThread.CurrentCulture的区别探讨
CultureInfo.CurrentCulture 与 Thread.CurrentThread.CurrentCulture 的差异分析
问题背景
在开展多线程与日期解析测试时,需要修改当前线程的文化信息,由此产生疑问:CultureInfo.CurrentCulture 和 Thread.CurrentThread.CurrentCulture 之间是否存在差异?两者的智能提示完全一致:
获取或设置当前线程的区域性。
返回值:
表示当前线程区域性的对象。
测试代码
using System.Globalization; using System.Threading; Console.WriteLine("Hello, World!"); string dateValueString = "05/07/2022"; CultureInfo enGB = new CultureInfo("en-GB"); CultureInfo enUS = new CultureInfo("en-US"); DateTime result = DateTime.Now; DateTime result2 = DateTime.Now; Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}"); if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result)) { Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}"); result2 = DateTime.Parse(dateValueString); Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}"); } Console.WriteLine(System.Environment.NewLine); Thread.CurrentThread.CurrentCulture = enGB; Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}"); if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result)) { Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}"); result2 = DateTime.Parse(dateValueString); Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}"); } Console.WriteLine(System.Environment.NewLine); Thread.CurrentThread.CurrentCulture = enUS; Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}"); if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result)) { Console.WriteLine($"Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}"); result2 = DateTime.Parse(dateValueString); Console.WriteLine($"[Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}"); } Console.WriteLine(System.Environment.NewLine); new Thread(() => { Thread.CurrentThread.CurrentCulture = enGB; Console.WriteLine($"CurrentCulture: {CultureInfo.CurrentCulture.Name} - ThreadCulture: {Thread.CurrentThread.CurrentCulture.Name}"); if (DateTime.TryParse(dateValueString, enGB, DateTimeStyles.None, out result)) { Console.WriteLine($"[Thread] Original: {dateValueString} Parsed: {result}. Day: {result.Day}. Month: {result.Month}. Year: {result.Year}"); result2 = DateTime.Parse(dateValueString); Console.WriteLine($"[Thread][Parse]Original: {dateValueString} Parsed: {result2}. Day: {result2.Day}. Month: {result2.Month}. Year: {result2.Year}"); } }).Start(); Console.WriteLine(System.Environment.NewLine);
测试输出
CurrentCulture: es-ES - ThreadCulture: es-ES Original: 05/07/2022 Parsed: 05/07/2022 0:00:00. Day: 5. Month: 7. Year: 2022 [Parse]Original: 05/07/2022 Parsed: 05/07/2022 0:00:00. Day: 5. Month: 7. Year: 2022 CurrentCulture: en-GB - ThreadCulture: en-GB Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022 [Parse]Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022 CurrentCulture: en-US - ThreadCulture: en-US Original: 05/07/2022 Parsed: 7/5/2022 12:00:00 AM. Day: 5. Month: 7. Year: 2022 [Parse]Original: 05/07/2022 Parsed: 5/7/2022 12:00:00 AM. Day: 7. Month: 5. Year: 2022 CurrentCulture: en-GB - ThreadCulture: en-GB [Thread] Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022 [Thread][Parse]Original: 05/07/2022 Parsed: 05/07/2022 00:00:00. Day: 5. Month: 7. Year: 2022
结论
CultureInfo.CurrentCulture 和 Thread.CurrentThread.CurrentCulture 完全等价,不存在功能差异。
在.NET底层实现中,CultureInfo.CurrentCulture 就是对 Thread.CurrentThread.CurrentCulture 的封装——读取时直接返回当前线程的文化信息,设置时也直接修改当前线程的文化属性。测试结果也验证了这一点:无论修改哪一个属性,另一个都会同步变化;在新线程中设置线程文化后,两个属性的值也完全一致。
日常开发中可根据代码可读性选择使用哪一个,效果完全相同。
内容的提问来源于stack exchange,提问作者blfuentes
相关产品推荐
相关产品推荐

