ある本で C# の練習問題をいくつか読んでいたのですが、困惑する例に出会いました。本からそのまま引用すると、出力行は次のようになります。
Console.WriteLine($"\n\tYour result is {result}.");
コードは動作し、 はdouble result
期待どおりに表示されます。ただし、 が文字列の先頭にある理由が理解できなかったため$
、 を削除することにしました。これで、コードは内容ではなく配列の名前を出力します{result}
。残念ながら、この本では $ がなぜそこにあるかは説明されていません。
文字列のフォーマットとオーバーロード メソッドに関して、VB 2015 ヘルプと Google を徹底的に調べましたConsole.WriteLine
。なぜそうなるのかを説明するものは見つかりませんでした。アドバイスをいただければ幸いです。
ベストアンサー1
これは、 と呼ばれる C# 6 の新機能ですInterpolated Strings
。
最も簡単に理解する方法は、補間された文字列式は、含まれる式を式の結果のToString 表現に置き換えることによって文字列を作成するというものです。
詳細については、こちらをご覧ください。マイクロソフト。
さて、もう少し考えてみましょう。この機能が優れているのはなぜでしょうか?
たとえば、次のクラスがあるとしますPoint
。
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
2 つのインスタンスを作成します。
var p1 = new Point { X = 5, Y = 10 };
var p2 = new Point { X = 7, Y = 3 };
次に、画面に出力します。通常使用する 2 つの方法は次のとおりです。
Console.WriteLine("The area of interest is bounded by (" + p1.X + "," + p1.Y + ") and (" + p2.X + "," + p2.Y + ")");
ご覧のとおり、このように文字列を連結すると、コードが読みにくくなり、エラーが発生しやすくなります。次のようにするstring.Format()
と、コードが読みやすくなります。
Console.WriteLine(string.Format("The area of interest is bounded by({0},{1}) and ({2},{3})", p1.X, p1.Y, p2.X, p2.Y));
これにより、新たな問題が発生します。
- 引数の数とインデックスは自分で管理する必要があります。引数の数とインデックスが同じでない場合、実行時エラーが発生します。
これらの理由から、新しい機能を使用する必要があります。
Console.WriteLine($"The area of interest is bounded by ({p1.X},{p1.Y}) and ({p2.X},{p2.Y})");
コンパイラがプレースホルダーを管理するようになったため、正しい引数を文字列内に配置するだけでよいため、正しい引数のインデックス付けを心配する必要がなくなりました。
全文は以下をお読みくださいこのブログ。