Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么`Trace.Writeline()`缺少`Writeline(字符串格式,参数对象[]args)`重载?_C#_.net - Fatal编程技术网

C# 为什么`Trace.Writeline()`缺少`Writeline(字符串格式,参数对象[]args)`重载?

C# 为什么`Trace.Writeline()`缺少`Writeline(字符串格式,参数对象[]args)`重载?,c#,.net,C#,.net,具有具有以下签名的重载: 公共静态void WriteLinestring格式,参数对象[]args 不具有该重载,尽管它具有Debug.WriteLine所具有的所有其他重载 有人知道这一遗漏的原因吗 我想我自己也没有理由回避它吧?我之所以问这个问题,是因为我正在实现一个日志接口,默认实现将只使用Debug.WriteLine和Trace.WriteLine,我想知道任何奇怪的结果。不过我无法想象。好吧,我不确定我说了什么,但我冒了一次险 当我反编译这些方法时,它们都使用相同的TraceInt

具有具有以下签名的重载:

公共静态void WriteLinestring格式,参数对象[]args

不具有该重载,尽管它具有Debug.WriteLine所具有的所有其他重载

有人知道这一遗漏的原因吗

我想我自己也没有理由回避它吧?我之所以问这个问题,是因为我正在实现一个日志接口,默认实现将只使用Debug.WriteLine和Trace.WriteLine,我想知道任何奇怪的结果。不过我无法想象。

好吧,我不确定我说了什么,但我冒了一次险

当我反编译这些方法时,它们都使用相同的TraceInternal.WriteLinestring方法

当我反编译Debug.WriteLine方法字符串时,对象[]

当我反编译Trace.WriteLinestring时

正如您所看到的,唯一的区别是,第一个使用string.format方法。看起来对我来说没什么大不了的

但为什么会有遗漏呢?我不知道。作为ken2k,我相信这只能由基类库开发人员来回答。

好吧,我不确定我说了什么,但我冒了一次险

当我反编译这些方法时,它们都使用相同的TraceInternal.WriteLinestring方法

当我反编译Debug.WriteLine方法字符串时,对象[]

当我反编译Trace.WriteLinestring时

正如您所看到的,唯一的区别是,第一个使用string.format方法。看起来对我来说没什么大不了的


但为什么会有遗漏呢?我不知道。作为ken2k,我相信这只能由基类库开发人员来回答。

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

乍一看,我认为

Debug.WriteLineValue={0},Test

将打印:

值=测试

但事实上,它打印的是:

测试:值={0}

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

所以真的,应该避免这种误导性的功能,伊姆霍

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


我现在通过复制NLog的功能来规避代码中的问题-我要求通过工厂方法将类名传递给日志类的构造函数,这样就不会将类名传递给任何消息格式化程序。

我发现了一个不应该在我自己的代码中添加这样一个接口的原因:因为这会产生误导

乍一看,我认为

Debug.WriteLineValue={0},Test

将打印:

值=测试

但事实上,它打印的是:

测试:值={0}

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

所以真的,应该避免这种误导性的功能,伊姆霍

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


我现在通过复制NLog的功能来规避代码中的问题-我要求通过工厂方法将类名传递给日志类的构造函数,这样,就不会将类名传递给任何消息格式化程序。

我有一个BCL设计师/开发人员的想法,他在10年前就做过这个工作,读了这个问题,笑了。疯狂地笑。是的,这不会让我感到惊讶要么他们从未想过要加上它,要么他们懒得花时间。调用string.Format并将结果传入,或者使用所需的签名编写自己的方法,将格式化的结果传递给跟踪。我们不太可能知道其他人选择的具体原因,当然我们也不是能够改变BCL的人。@Servy:我就是这么做的。在本例中,我只是为NLog编写了一个日志包装器,但默认实现只写入Debug.WriteLine和Trace.WriteLine,这就是我遇到这个问题的原因。我不希望有任何真正的原因,但我只是想以防万一。事实上,Debug.WriteLinestring,object[]重载是在4.0中才添加的:所以可能是3年前的BCL开发人员:我有一个BCL设计师/开发人员的愿景,他在10年前就做过这个工作,读了这个问题,笑了。疯狂地笑。是的,这不会让我感到惊讶要么他们从未想过要加上它,要么他们懒得花时间。调用string.Format并传入结果,或者写入
您自己的方法,带有所需的签名,该签名将格式化结果传递给跟踪。我们不太可能知道其他人选择的具体原因,当然我们也不是能够改变BCL的人。@Servy:我就是这么做的。在本例中,我只是为NLog编写了一个日志包装器,但默认实现只写入Debug.WriteLine和Trace.WriteLine,这就是我遇到这个问题的原因。我不希望有任何真正的原因,但我只是想以防万一。事实上,Debug.WriteLinestring,object[]重载是在4.0中才添加的:所以可能是3年前的BCL开发人员:虽然这是真的,但问题更多的是关于IMO遗漏的原因。尽管如此,我想无论如何只有BCL开发人员可以回答…@ken2k你完全正确。我不知道遗漏的部分。是的,说实话,我本来可以把这个问题措辞得更好。我很担心他们为什么省略它,我是否有理由也省略它。事实证明,在IMO中不提供特定的方法签名是有原因的——请参阅我编辑的问题。虽然这是事实,但问题更多的是关于IMO遗漏的原因。尽管如此,我想无论如何只有BCL开发人员可以回答…@ken2k你完全正确。我不知道遗漏的部分。是的,说实话,我本来可以把这个问题措辞得更好。我很担心他们为什么省略它,我是否有理由也省略它。事实证明,在IMO中不提供特定的方法签名是有原因的——请参阅我编辑的问题。
public static void WriteLine(string format, params object[] args)
{
   TraceInternal.WriteLine(string.Format((IFormatProvider) CultureInfo.InvariantCulture, format, args));
}
public static void WriteLine(string message)
{
   TraceInternal.WriteLine(message);
}