C#或.NET中最糟糕的問題是什麼? [關閉]

我最近使用DateTime對象,並寫了這樣的東西: 多線程

DateTime dt = DateTime.Now;
dt.AddDays(1);
return dt; // still today's date! WTF?

AddDays()的intellisense文檔說它在日期中添加了一天,但它沒有 - 它實際上返回了添加了一天的日期,所以您必須將其寫爲: spa

DateTime dt = DateTime.Now;
dt = dt.AddDays(1);
return dt; // tomorrow's date

這個曾經屢次咬過我,因此我認爲編制最糟糕的C#陷阱會頗有用。 線程


#1樓

DateTime.ToString(「dd / MM / yyyy」) ; 這實際上並不總能給你dd / MM / yyyy,而是會考慮區域設置並根據你所在的位置替換你的日期分隔符。 因此你可能會獲得dd-MM-yyyy或相似的東西。 code

正確的方法是使用DateTime.ToString(「dd'/'MM'/'yyyy」); orm


DateTime.ToString(「r」)應該轉換爲使用GMT的RFC1123。 GMT距離UTC只有幾分之一秒,但「r」格式說明符不會轉換爲UTC ,即便有問題的DateTime被指定爲Local。 對象

這致使如下問題(取決於您的本地時間與UTC的距離): 文檔

DateTime.Parse("Tue, 06 Sep 2011 16:35:12 GMT").ToString("r")
>              "Tue, 06 Sep 2011 17:35:12 GMT"

哎呦! get


#2樓

今天我修了一個很長時間沒收的錯誤。 該錯誤位於多線程場景中使用的泛型類中,而靜態int字段用於使用Interlocked提供無鎖同步。 該錯誤是因爲類型的泛型類的每一個實例化都有本身的靜態引發的。 所以每一個線程都有本身的靜態字段,並無按預期使用鎖。 同步

class SomeGeneric<T>
{
    public static int i = 0;
}

class Test
{
    public static void main(string[] args)
    {
        SomeGeneric<int>.i = 5;
        SomeGeneric<string>.i = 10;
        Console.WriteLine(SomeGeneric<int>.i);
        Console.WriteLine(SomeGeneric<string>.i);
        Console.WriteLine(SomeGeneric<int>.i);
    }
}

這打印5 10 5 string


#3樓

我參加這個聚會有點晚了,但我最近有兩個問題都咬了我:

日期時間分辨率

Ticks屬性測量時間爲百萬分之一秒(100納秒塊),但分辨率不是100納秒,大約是15毫秒。

這段代碼:

long now = DateTime.Now.Ticks;
for (int i = 0; i < 10; i++)
{
    System.Threading.Thread.Sleep(1);
    Console.WriteLine(DateTime.Now.Ticks - now);
}

會給你一個輸出(例如):

0
0
0
0
0
0
0
156254
156254
156254

相似地,若是你查看DateTime.Now.Millisecond,你將得到15.625ms的圓形塊的值:15,31,46等。

這種特殊行爲因系統而異 ,但在此日期/時間API中還有其餘與分辨率相關的問題


Path.Combine

組合文件路徑的好方法,但它並不老是按照您指望的方式運行。

若是第二個參數以\\字符開頭,它將不會爲您提供完整的路徑:

這段代碼:

string prefix1 = "C:\\MyFolder\\MySubFolder";
string prefix2 = "C:\\MyFolder\\MySubFolder\\";
string suffix1 = "log\\";
string suffix2 = "\\log\\";

Console.WriteLine(Path.Combine(prefix1, suffix1));
Console.WriteLine(Path.Combine(prefix1, suffix2));
Console.WriteLine(Path.Combine(prefix2, suffix1));
Console.WriteLine(Path.Combine(prefix2, suffix2));

給你這個輸出:

C:\MyFolder\MySubFolder\log\
\log\
C:\MyFolder\MySubFolder\log\
\log\

#4樓

[Serializable]
class Hello
{
    readonly object accountsLock = new object();
}

//Do stuff to deserialize Hello with BinaryFormatter
//and now... accountsLock == null ;)

故事的道德:反序列化對象時不會運行字段初始化器


#5樓

MS SQL Server沒法處理1753年以前的日期。重要的是,這與.NET DateTime.MinDate常量(1/1/1)不一樣步。 所以,若是你試圖保存一個思想,一個畸形的日期(最近發生在個人數據導入中)或者僅僅是征服者威廉的出生日期,你就會遇到麻煩。 沒有內置的解決方法; 若是您可能須要在1753年以前使用日期,則須要編寫本身的解決方法。

相關文章
相關標籤/搜索