文字列補間がメソッドのオーバーロードをstring
ではなく優先するのはなぜIFormattable
ですか?
次のことを想像してみてください。
static class Log {
static void Debug(string message);
static void Debug(IFormattable message);
static bool IsDebugEnabled { get; }
}
非常に高価なオブジェクトがありますToString()
。以前、私は次のことをしました:
if (Log.IsDebugEnabled) Log.Debug(string.Format("Message {0}", expensiveObject));
ここで、IsDebugEnabledロジックを内部に配置しDebug(IFormattable)
、必要な場合にのみメッセージ内のオブジェクトに対してToString()を呼び出したいと思いました。
Log.Debug($"Message {expensiveObject}");
ただし、これはDebug(string)
過負荷を呼び出します。
これは、Roslynチームによる意図的な決定です。
私たちは一般的に、ライブラリは、さまざまなことを行うメソッドに対してさまざまなAPI名で記述されると考えています。したがって、FormattableStringとStringの間のオーバーロード解像度の違いは重要ではないため、stringが優先される可能性があります。したがって、補間された文字列は文字列であるという単純な原則に固執する必要があります。話の終わり。
これについてはリンクでさらに議論されていますが、結論としては、異なるメソッド名を使用することを期待しています。
一部のライブラリAPIは、より安全または高速であるため、消費者がFormattableStringを使用することを本当に望んでいます。文字列を受け取るAPIとFormattableStringを受け取るAPIは実際には異なることを行うため、同じ名前でオーバーロードしないでください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加