2013-03-19 23 views
1

Debug.WriteLine()具有以下簽名的重載:爲什麼`Trace.Writeline()`缺少'WriteLine(string format,params Object [] args)`overload?

public static void WriteLine(string format, params Object[] args)

Trace.WriteLine()不具有過載(雖然它擁有所有的其他人Debug.WriteLine()了)。

有誰知道這個遺漏的原因是什麼?

沒有理由讓我避開它我自己,我承擔? (我只問,因爲我實現日誌接口,默認實現將只使用Debug.WriteLine()Trace.WriteLine(),我想知道任何奇怪的後果的。我無法想象任何雖然)。

+6

我有這樣一個BCL設計人員/開發人員的願景,他在這個10年前就讀過這個問題並大笑過。瘋狂地笑着。 – 2013-03-19 14:18:01

+0

是的,那不會讓我感到驚訝。 :) – 2013-03-19 14:18:54

+1

要麼他們從來沒有想過要添加它或不能花時間打擾。或者調用'string.Format'並傳遞結果,或者用自己想要的簽名編寫自己的方法,將格式化後的結果傳遞給Trace。我們不太可能知道其他人選擇的具體原因,我們當然不是那些能夠改變BCL的人。 – Servy 2013-03-19 14:19:17

回答

3

,我不確定我說了什麼,但我有機會。

當我反編譯這些方法,它們都使用相同的方法TraceInternal.WriteLine(string)

當我反編譯Debug.WriteLine Method (String, Object[]);

public static void WriteLine(string format, params object[] args) 
{ 
    TraceInternal.WriteLine(string.Format((IFormatProvider) CultureInfo.InvariantCulture, format, args)); 
} 

當我反編譯Trace.WriteLine(string);

public static void WriteLine(string message) 
{ 
    TraceInternal.WriteLine(message); 
} 

正如你看到的,唯一的區別在於,第一個使用string.format()方法。看起來對我來說沒什麼大不了的。

但是爲什麼要省略?我不知道。作爲ken2k mentioned,我相信這可以完全以僅基類庫開發人員來回答..

+1

雖然這是真的,但問題更多的是爲什麼*忽略海事組織。這就是說,我猜只有BCL開發者可以回答這個問題...... – ken2k 2013-03-19 14:28:56

+0

@ ken2k你是完全正確的,我不知道_omission_部分 – 2013-03-19 14:34:06

+0

是的,說實話,我可以更好地表達這個問題,我擔心他們爲什麼會忽略它,並且我有理由忽略它。有沒有理由不提供該特定的方法簽名(海事組織) - 見我編輯的問題。 – 2013-03-19 14:39:53

3

我發現一個原因,我不應該在我自己的代碼添加這樣的界面:因爲這是誤導。

乍一看,我還以爲

Debug.WriteLine("Value = {0}", "Test");

將打印:

Value = Test

但實際上它打印:

Test: Value = {0}

這是如此誤導的原因是因爲有很多類似的格式化方法,如string.Format(),Console.WriteLine()等等。

因此,其實,這樣的誤導性的功能應該是可以避免的,恕我直言。

這並沒有真正直接回答我原來的問題 - 但它解釋了爲什麼該方法最初並不是在.NET。它並不能解釋爲什麼他們在更高版本中添加它。我現在認爲他們不應該有。我現在通過複製NLog所做的事情來繞過這個問題 - 我需要類名(通過工廠方法)傳遞給我的日誌記錄類的構造函數,這樣類名永遠不會被刪除傳遞給任何消息格式化程序)。

相關問題