web-dev-qa-db-ja.com

C#の補間された文字列のオプションの引数は何ですか?

補間された文字列は、C#6.0の新機能の1つです。

MSDNによると、埋め込まれたC#式の構文には、オプションのコンマ区切り値を含めることができます。これは documentation<optional-comma-field-width>と見なされます。

残念ながら、このフィールドの目的は見つかりませんでした。

その名前から、この値は「補間された」フィールドの最大サイズを設定すると考えるかもしれませんが、次の式を試してみると、

var p = Process.GetCurrentProcess();
Console.WriteLine($"Process name is {p.ProcessName, 5}");

次の出力が表示されます。

Process name is LINQPad.UserQuery
27

maximumではなく、そのフィールドに使用するminimumの幅です。文字列は、幅に指定した5文字より長いため、フィールドは文字列の長さに拡張されます。幅が長いほど、違いが劇的にわかります。

var p = Process.GetCurrentProcess();
$"Process name is {p.ProcessName, 50}".Dump();

利回り:

Process name is                                  LINQPad.UserQuery

正のフィールドサイズは右寄せされます。負のフィールドサイズは左揃えになります。

ドキュメントは、MSDNの Composite Formatting ページの方が優れています。

オプションの配置コンポーネントは、適切なフォーマット済みフィールド幅を示す符号付き整数です。アラインメントの値がフォーマットされた文字列の長さより短い場合、アラインメントは無視され、フォーマットされた文字列の長さがフィールド幅として使用されます。フィールド内のフォーマット済みデータは、配置が正の場合は右寄せされ、配置が負の場合は左寄せされます。パディングが必要な場合は、空白が使用されます。位置合わせを指定する場合は、コンマが必要です。

46
D Stanley

数値はalignmentであり、Alignment Component here に記載されています。

フィールド内のフォーマット済みデータは、配置が正の場合は右寄せされ、配置が負の場合は左寄せされます。

あなたの例では、alignmentは、p.ProcessName文字よりも短い場合、5にスペースを埋め込みます。文字列の長さがalignmentの絶対値よりも小さい場合(例のように)、alignmentは効果がありません。

var text = "MyText";
Console.WriteLine($"x{text}x");
Console.WriteLine($"x{text, 3}x");
Console.WriteLine($"x{text, 10}x");
Console.WriteLine($"x{text, -10}x");

結果

xMyTextx
xMyTextx
x    MyTextx
xMyText    x
17