2010-05-01 70 views
3

我在类库中有很多代码没有指定CultureInfo.InvariantCulture。例如在toString操作,toBool,toInt等有没有办法设置一个DLL默认情况下总是遵循CultureInfo.InvariantCulture,如果没有指定?

有没有一种方法可以为类库设置一个属性,始终使用CultureInfo.InvariantCulture执行,即使它没有在代码中的任何位置明确指定?

有点像全局开关?

它不仅凌乱不得不每次明确键入它,它使我的代码的可读性,并且是例如皇家疼痛:

if (Convert.ToInt16(task.RetryCount, CultureInfo.InvariantCulture) < 
      Convert.ToInt16(ConfigurationManager.AppSettings["TasksMaxRetry"], CultureInfo.InvariantCulture)) 

回答

6

虽然我同意Mark's answer是提出的问题的正确答案;我不认为改变线程文化是一个好设计。如果应用程序的其他部分(很可能是UI)依赖于线程当前的文化,它可能会引入微妙的错误。另外,我认为在Convert调用中明确地陈述文化是一个很好的设计,它告诉读者代码,原始程序员已经决定允许哪种格式;而且代码不仅仅是“巧合工作”。

您很可能想要将许多解析操作组合到同一个类中;也许是一个处理阅读配置的问题。在这个类,你可以定义一个字段来包含你想用解析文化:

private static readonly IFormatProvider parseFormat = CultureInfo.InvariantCulture; 

然后使用该字段在任何调用转换方法或相似。将字段声明为IFormatProvider以及精心选择的名称,非常明确地告诉读者代码,这是用于定义解析格式的字段。恕我直言,它使代码的意图更清晰。

另一种方法是制作您自己的Parse/Convert类,它包装Convert.ToXxx方法并用您打算使用的格式调用它们。然后,您将获得所需的好处,无需在每次调用中明确说明格式。

3

我不这么认为,但有可能设置在每个线程的基础CultureInfo的:

Console.WriteLine(double.Parse("1.000")); 
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 
Console.WriteLine(double.Parse("1.000")); 

输出我的机器上(您的输出可能会根据您当前的文化会发生变化):

1000 
1 

这是你想要的吗?

+0

谢谢Mark,我将不得不将此作为未来项目的设计考虑事项。 – 2010-05-01 09:36:18

相关问题