簡體   English   中英

是.NET double.ToString線程安全嗎?

[英]Is .NET double.ToString threadsafe?

我在生產ASP.NET應用程序中看到一個涉及以下代碼的問題,該代碼用於呈現特定對象的地理坐標:

private double _longitude;
private double _latitude;

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

Thread.CurrentThread.CurrentCulture將根據傳入請求設置為不同的值。 我看到的行為是這個函數的結果將獨立於threadlocal文化而變化。 有時小數點和逗號對於當前文化是不正確的。 更奇怪的是,似乎一旦出錯,錯誤的價值仍然存在。

對雙緩存值進行ToString嗎?

它不應該緩存值,特別是因為您提到的文化問題。 我想到兩件事:

  1. 您如何/在何處設置文化? 也許那里有一個bug?
  2. 你確定它是創建的bug 這個地方? 也許文化與你想的不同? 也許這個函數的結果緩存在代碼的其他地方?

為什么不使用允許您手動指定特定於區域性的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM