2017-10-23 8 views
3

は、link here.なぜstring.FormatがArgumentNullExceptionをスローしないのですか?フォーマットは(かなり合理的)nullの場合MSDN String.Formatのによると

をスローしかし、テストは、それが唯一の2番目の引数は、同様nullの場合、二番目が移入されていない場合ことないと言います。

以下がスローしない:

string test = string.Format(null, "string"); 

は次のように、最初のパラメータ(フォーマット)不満スロー:

string test = string.Format(null, null); 

ソースコードは、次のメソッドを呼び出すJustDecompileとfuther掘ります

private static string FormatHelper(IFormatProvider provider, string format, ParamsArray args) 
{ 
    if (format == null) 
    { 
     throw new ArgumentNullException("format"); 
    } 
    return StringBuilderCache.GetStringAndRelease(StringBuilderCache.Acquire(format.Length + args.Length * 8).AppendFormatHelper(provider, format, args)); 
} 

フォーマットとしては意味がありませんが、例外はありません。iスローされる。何かヒント?

答えて

9

ああ、過負荷解決の喜び。その場合、実際にはstring.Format(IFormatProvider, string, params object[])を呼び出しているので、providerパラメータのnull引数を渡します。これは完全に有効です(現在のカルチャを使用することを意味します)。

第2引数の文字列リテラルからstringへの変換が、文字列リテラルからobjectへの変換よりも優れているため、オーバーロードが「より良い」です。あなたが右のオーバーロードを強制的に引数名を使用する場合は

、これをロード:予想通り

string text = string.Format(format: null, arg0: "string"); 

は...それは例外をスローします。

+0

これは、私がメソッドの引数に 'null'ではなく' default(T) 'を渡すという習慣を得ようとした理由です。あなたが 'null'を渡すときに正しいメソッドにバインドしても、誰かがあなたのコードを破壊する過負荷を導入しないという保証はありません。さらに悪いことに、あなたはそれをしばらく気付かないかもしれません。 –

+0

これは悪臭を過負荷にする理由です。人々がFormatByProviderのようなメソッド名を修飾するようにする。あなたはいつでも自分のメソッド名でそれを行うことができます。はい、あなたのコードは長くなります。そして、人々はこの突っ込みを呼ぶでしょう。単体テストはあなたのコードを長くしてしまい、人々はそれらが凶悪であると言っている人はいません。 – FastAl

+0

素晴らしい。ありがとうジョン。 –

関連する問題