Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果未指定,是否有方法将DLL设置为默认情况下始终遵循CultureInfo.InvariantCulture?_C# - Fatal编程技术网

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;