1

Debug.WriteLine()には、次のシグネチャを持つオーバーロードがあります。

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

Trace.WriteLine()にはそのオーバーロードがありません (他のすべてのオーバーロードはありますDebug.WriteLine()が)。

誰かがこの省略の理由を知っていますか?

自分で避ける理由はないのでは?(私はロギングインターフェースを実装しているので、私は尋ねるだけです。デフォルトの実装は and を使用するだけ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()です。

本当に、そのような誤解を招く機能は避けるべきです、IMHO。

これは私の元の質問に直接答えているわけではありませんが、メソッドが元々 .Net になかった理由を説明しています。後のバージョンで追加した理由は説明されていません。私は今、彼らが持つべきではないという意見です。

(NLogが行うことをコピーすることで、コードの問題を回避しました-クラス名がログクラスのコンストラクターに(ファクトリメソッドを介して)渡される必要があるため、クラス名はいずれにも渡されませんメッセージ フォーマッタ)。

于 2013-03-19T14:44:41.737 に答える