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'.
誰かが同じことについて深い知識を持っている場合、これについてより詳細な答えを得ることができますか?.
FormattableString
は.NET 4.6の新しいタイプであり、コンパイラーはtryを使用する場合にのみ使用します。言い換えると、補間された文字列リテラルのタイプは通常string
-_string.Format
_で構築されますが、FormattableString
(FormattableStringFactory
を介して)にすることもできます。それ。
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
_