是.NET double.ToString线程安全吗?

时间:2010-02-18 23:35:35

标签: c# thread-safety

我在生产ASP.NET应用程序中看到一个涉及以下代码的问题,该代码用于呈现特定对象的地理坐标:

private double _longitude;
private double _latitude;

public string ToCsvString()
{
    return _latitude + "," + _longitude;
}

Thread.CurrentThread.CurrentCulture将根据传入请求设置为不同的值。我看到的行为是这个函数的结果将独立于threadlocal文化而变化。有时小数点和逗号对于当前文化是不正确的。更奇怪的是,似乎一旦出错,错误的价值仍然存在。

对双缓存值进行ToString吗?

6 个答案:

答案 0 :(得分:2)

它不应该缓存值,特别是因为您提到的文化问题。我想到了两件事:

  1. 您如何/在何处设置文化?也许那里有一个错误?
  2. 您确定这个会产生错误吗?也许文化与你想的不同?也许这个函数的结果缓存在代码的其他地方?

答案 1 :(得分:1)

为什么不使用允许您手动指定特定于文化的IFormatProvider的显式ToString方法?

答案 2 :(得分:0)

为了渲染地理坐标,我建议您最好定义自己的固定格式或文化,而不是将其留给正在运行的线程的框架,默认文化设置或文化信息。

我会这样做将它格式化为4个小数点:

return _latitude.ToString("0.0000") + "," + _longitude.ToString("0.0000");

string.Format("{0:0.0000}, "{1:0.0000}", _latitude, _longitude);

或者,如果您希望小数点分隔符是特定于文化的,

CultureInfo ci = System.Globalization.CultureInfo.GetCultureInfo("en-AU");
return _latitude.ToString("N4", ci) + "," + _longitude.ToString("N4", ci);

答案 3 :(得分:0)

如果您始终希望Double.ToString返回一致的值而不管文化,请使用InvariantCulture:

someDouble.ToString(CultureInfo.InvariantCulture); 

答案 4 :(得分:0)

对于double或任何其他不可变对象上的ToString等操作,根据定义是线程安全的。由于您可以保证这些对象从不更改操作的状态将始终产生相同的结果,因此该结果可能基于其执行的环境但始终在相同的环境中产生相同的结果。由于对不可变类型没有副作用,ToString无法缓存结果

答案 5 :(得分:-1)

msdn中的任何页面都会向您显示这一事实 “此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何实例成员都不能保证是线程安全的”

例如看一下这个 http://msdn.microsoft.com/en-us/library/system.delegate.aspx

因此,double.ToString()不保证是线程安全的,因为它是一个实例方法。

我会回应Anon所建议的并使用IformatProvider