C# - 新的CultureInfo实例化性能

时间:2013-09-19 18:58:50

标签: c# .net cultureinfo

我想知道在循环过程中重复实例化一个CultureInfo对象是好的做法(几千次)。许多Date和String方法都需要此对象,以便在CurrentCulture可能不正确时强制使用特定的文化。

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

重复实例化的表现是什么?

3 个答案:

答案 0 :(得分:9)

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

更好的是,使用此方法:

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

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

更好的是,出于你的目的:

  

许多Date和String方法都需要此[CultureInfo]对象   在CurrentCulture可能的情况下强制使用特定的文化   不是正确的。

使用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 ;

答案 1 :(得分:1)

为什么不直接在循环外声明文化并在循环中使用实例引用?

你投入的时间越长

答案 2 :(得分:0)

如果是winforms / wpf app: How to: Set the Culture and UI Culture for Windows Forms Globalization

// 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");