web-dev-qa-db-ja.com

String、FormattableString、IFormattableの違い

FormattableStringはC#6.0で導入されました。 stringオブジェクトを使用して同じ文字列フォーマットを使用できるので、FormattableStringまたはIFormattableを使用する必要があるのはなぜですか。 3つの違いは何ですか?

私のコード

        var name = "Pravin";
        var s = $"Hello, {name}";
        System.IFormattable s1 = $"Hello, {name}";
        System.FormattableString s2 = $"Hello, {name}";

何よりも結果は同じです。つまり'Hello Pravin'.

誰かが同じことについて深い知識を持っている場合、これについてより詳細な答えを得ることができますか?.

40
Nitin Varpe

FormattableStringは.NET 4.6の新しいタイプであり、コンパイラーはtryを使用する場合にのみ使用します。言い換えると、補間された文字列リテラルのタイプは通常string-_string.Format_で構築されますが、FormattableStringFormattableStringFactoryを介して)にすることもできます。それ。

FormattableStringは、_string.Format_に渡されるフォーマット文字列(_"Hello, {0}"_など)と、フォーマットするために渡される引数で構成されます。重要なのは、この情報はフォーマット前にキャプチャされる前にであることです。

これにより、フォーマットを適切に調整できます。最も一般的には、不変カルチャーで、通常 Invariant static method を使用してフォーマットを実行します。

補間された文字列リテラルをIFormattable変数に割り当てると、FormattableStringも使用されます。 IFormattable.ToString(string, CultureInfo) implementation は、この場合、最初の引数を無視します。これが、明示的なインターフェイス実装を使用している理由です。

サンプルコード:

_using System;
using System.Globalization;
using System.Threading;
using static System.FormattableString;

class Test
{
    static void Main()
    {
        var uk = CultureInfo.CreateSpecificCulture("en-GB");
        Thread.CurrentThread.CurrentCulture = uk;
        var germany = CultureInfo.CreateSpecificCulture("de-DE");
        string now = $"Default: it is now {DateTime.UtcNow}";
        Console.WriteLine(now); // UK format
        IFormattable x = $"Specific: It is now {DateTime.UtcNow}";
        Console.WriteLine(x.ToString("ignored", germany));
        FormattableString y = $"FormattableString: It is now {DateTime.UtcNow}";
        Console.WriteLine(FormattableString.Invariant(y));
        // Via using static
        Console.WriteLine(Invariant($"It is now {DateTime.UtcNow}")); 
    }
}
_

結果の例:

_Default: it is now 16/02/2016 07:16:21
Specific: It is now 16.02.2016 07:16:21
FormattableString: It is now 02/16/2016 07:16:21
It is now 02/16/2016 07:16:21
_
58
Jon Skeet