[英]Is .NET double.ToString threadsafe?
我在生產ASP.NET應用程序中看到一個涉及以下代碼的問題,該代碼用於呈現特定對象的地理坐標:
private double _longitude;
private double _latitude;
public string ToCsvString()
{
return _latitude + "," + _longitude;
}
Thread.CurrentThread.CurrentCulture將根據傳入請求設置為不同的值。 我看到的行為是這個函數的結果將獨立於threadlocal文化而變化。 有時小數點和逗號對於當前文化是不正確的。 更奇怪的是,似乎一旦出錯,錯誤的價值仍然存在。
對雙緩存值進行ToString嗎?
它不應該緩存值,特別是因為您提到的文化問題。 我想到兩件事:
為什么不使用允許您手動指定特定於區域性的IFormatProvider的顯式ToString
方法?
為了渲染地理坐標,我建議您最好定義自己的固定格式或文化,而不是將其留給框架,默認文化設置或正在運行的線程的文化信息。
我會像這樣把它格式化為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);
如果您始終希望Double.ToString返回一致的值而不管文化,請使用InvariantCulture:
someDouble.ToString(CultureInfo.InvariantCulture);
對於double或任何其他不可變對象的ToString等操作,根據定義是線程安全的。 由於您可以保證這些對象的狀態永遠不會更改,因此操作將始終產生相同的結果,但該結果可能基於它在其中執行的環境,但它將始終在相同的環境中產生相同的結果。 由於對不可變類型沒有副作用,ToString無法緩存結果
msdn中的任何頁面都會向您顯示“此類型的任何公共靜態(在Visual Basic中共享)成員都是線程安全的事實。任何實例成員都不保證是線程安全的”
比如看看這個http://msdn.microsoft.com/en-us/library/system.delegate.aspx
因此,double.ToString()不保證是線程安全的,因為它是一個實例方法。
我會回應Anon所建議的並使用IformatProvider
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.