1

Debug.WriteLine()具有以下签名的重载:

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

Trace.WriteLine()没有该重载(尽管它具有所有其他重载Debug.WriteLine())。

有谁知道这个遗漏的原因?

我想我没有理由自己避免它?(我之所以这么问,是因为我正在实现一个日志接口,而默认实现只会使用Debug.WriteLine()并且Trace.WriteLine()我想知道任何奇怪的后果。我无法想象。)

4

2 回答 2

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提到的,我相信只有基类库开发人员才能完全回答这个问题。

于 2013-03-19T14:26:02.297 回答
3

我发现了一个不应该在自己的代码中添加这样一个接口的原因:因为它具有误导性。

乍一看,我以为

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

会打印:

Value = Test

但实际上它打印:

Test: Value = {0}

之所以如此具有误导性,是因为有很多类似的方法可以进行这样的格式化,例如string.Format(),Console.WriteLine()等等。

所以真的,应该避免这种误导性的功能,恕我直言。

这并不能真正直接回答我原来的问题——但它解释了为什么该方法最初不在.Net 中。它没有解释为什么他们在以后的版本中添加了它。我现在认为他们不应该这样做。

(我现在通过复制 NLog 所做的事情来规避代码中的问题 - 我需要将类名(通过工厂方法)传递给我的日志记录类的构造函数,以便类名永远不会传递给任何消息格式化程序。)

于 2013-03-19T14:44:41.737 回答