C# - 新的 CultureInfo 实例化性能

本文关键字:实例化 性能 CultureInfo 新的 | 更新日期: 2023-09-27 18:31:57

我想知道在循环过程中重复实例化CultureInfo对象(几千次)是否是一种好习惯。在许多日期和字符串方法中,当 CurrentCulture 可能不是正确的区域性时,需要此对象来强制使用特定的区域性。

var c = new CultureInfo("en-US", false);

重复实例化的性能如何?

C# - 新的 CultureInfo 实例化性能

人们会认为 C# 和/或 JIT 编译器中的优化器将具有识别循环不变表达式并在循环外重构的智能。我倾向于自己做这样的重构,使代码更清晰。

更好的是,使用此方法:

CultureInfo ci = CultureInfo.GetCultureInfo("en-US") ;

它为您提供了一个缓存的只读实例,该实例只会构造一次,然后从缓存中检索。

更好的是,为了您的陈述目的:

此 [ CultureInfo ] 对象在许多日期和字符串方法中都是必需的 强制使用特定区域性,当当前文化可能 不是正确的。

使用CultureInfo.InvariantCulture .这就是它存在的目的。

第三种选择是创建一个静态CultureInfo属性,其中包含对回退区域的单一实例引用。根据您的目的,您可能希望将其标记为线程本地(static CultureInfo方法是线程安全的;实例方法不是)。这样的属性可能看起来像这样:

public static string FallbackCultureId { get { return Configuration.AppSettings["FallbackConfigurationId"] ; } }
public static CultureInfo FallbackCultureInfo
{
  get { return fallBackCultureInfo ?? (fallBackCultureInfo=new CultureInfo(FallbackCultureId)) ; }            
}
[ThreadStatic] private static CultureInfo fallBackCultureInfo ;

为什么不在循环外部声明区域性并在循环中使用实例引用?

你投入的越多,花费的时间就越长

如果是 winforms/wpf 应用程序:如何:设置 Windows 窗体全球化的区域性和 UI 区域性

// C#
// Put the using statements at the beginning of the code module
using System.Threading;
using System.Globalization;
// Put the following code before InitializeComponent()
// Sets the culture to French (France)
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Sets the UI culture to French (France)
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");