我最近使用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#陷阱會頗有用。 線程
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
今天我修了一個很長時間沒收的錯誤。 該錯誤位於多線程場景中使用的泛型類中,而靜態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
我參加這個聚會有點晚了,但我最近有兩個問題都咬了我:
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中還有其餘與分辨率相關的問題 。
組合文件路徑的好方法,但它並不老是按照您指望的方式運行。
若是第二個參數以\\
字符開頭,它將不會爲您提供完整的路徑:
這段代碼:
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\
[Serializable] class Hello { readonly object accountsLock = new object(); } //Do stuff to deserialize Hello with BinaryFormatter //and now... accountsLock == null ;)
故事的道德:反序列化對象時不會運行字段初始化器
MS SQL Server沒法處理1753年以前的日期。重要的是,這與.NET DateTime.MinDate
常量(1/1/1)不一樣步。 所以,若是你試圖保存一個思想,一個畸形的日期(最近發生在個人數據導入中)或者僅僅是征服者威廉的出生日期,你就會遇到麻煩。 沒有內置的解決方法; 若是您可能須要在1753年以前使用日期,則須要編寫本身的解決方法。