C# 如果未指定,是否有方法将DLL设置为默认情况下始终遵循CultureInfo.InvariantCulture?
我在类库中有很多代码没有指定C# 如果未指定,是否有方法将DLL设置为默认情况下始终遵循CultureInfo.InvariantCulture?,c#,C#,我在类库中有很多代码没有指定CultureInfo.InvariantCulture。例如,在toString操作、toBool、toInt等中 是否有一种方法可以使类库始终使用CultureInfo.InvariantCulture执行一个属性,即使在代码中没有明确指定它 有点像全球开关 每次都要显式地键入它,这不仅会造成混乱,而且会降低代码的可读性,例如: if (Convert.ToInt16(task.RetryCount, CultureInfo.InvariantCulture) &
CultureInfo.InvariantCulture
。例如,在toString操作、toBool、toInt等中
是否有一种方法可以使类库始终使用CultureInfo.InvariantCulture
执行一个属性,即使在代码中没有明确指定它
有点像全球开关
每次都要显式地键入它,这不仅会造成混乱,而且会降低代码的可读性,例如:
if (Convert.ToInt16(task.RetryCount, CultureInfo.InvariantCulture) <
Convert.ToInt16(ConfigurationManager.AppSettings["TasksMaxRetry"], CultureInfo.InvariantCulture))
if(Convert.ToInt16(task.RetryCount,CultureInfo.InvariantCulture)<
Convert.ToInt16(ConfigurationManager.AppSettings[“TasksMaxRetry”],CultureInfo.InvariantCulture))
我不这么认为,但是可以在每个线程的基础上设置CultureInfo:
Console.WriteLine(double.Parse("1.000"));
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Console.WriteLine(double.Parse("1.000"));
我的机器上的输出(您的输出可能因您当前的文化而有所不同):
这就是你想要的吗?虽然我同意这是对所提出问题的正确答案;我不认为切换线程文化是一个好的设计。如果应用程序的其他部分(很可能是UI)依赖于当前的文化,那么它可能会引入一些微妙的错误。此外,我认为在Convert调用中明确说明区域性是一个好的设计,它告诉代码的读者,原始程序员已经对允许哪种格式做出了积极的决定;而且代码不仅仅是“巧合”
您很可能希望将许多解析操作分组到同一个类中;也许是处理读取配置的。在该类中,可以定义一个字段来包含要用于解析的区域性:
private static readonly IFormatProvider parseFormat = CultureInfo.InvariantCulture;
然后在任何调用中使用该字段来转换方法或类似方法。将该字段声明为IFormatProvider,再加上一个精心选择的名称,可以非常明确地告诉代码读者,这是一个用于定义解析格式的字段。嗯,这让代码的意图更清晰了
另一种方法是创建您自己的Parse/Convert类,该类包装Convert.ToXxx方法并使用您想要使用的格式调用它们。这样,您就可以不必在每次调用中明确说明格式,从而获得所需的好处。我必须将此作为未来项目的设计考虑,谢谢Mark。
private static readonly IFormatProvider parseFormat = CultureInfo.InvariantCulture;