web-dev-qa-db-ja.com

フォーマット変数を使用した文字列補間

私がすることができます:

var log = string.Format("URL: {0}", url);

またはこのように

var format = "URL: {0}";
...
var log = string.Format(format, url);

formatを別の場所で定義し、インライン文字列ではなくformat変数を使用しています。

C#6では、これは不可能に思えます。

var format = $"URL: {url}"; // Error url does not exist
...
var url = "http://google.com";
...
var log = $format; // The way to evaluate string interpolation here

とにかく先に宣言された変数で文字列補間を使用することはありますか?

C#6は、コンパイル時に文字列をインラインで補間するようです。ただし、この機能をローカライズに使用することを検討し、configでフォーマットを定義するか、クラスにconstのフォーマットを単純に設定してください。

24
CallMeLaNN

いいえ、文字列補間を使用する場合でもコンパイラが「通常の」形式の文字列を作成するため、文字列リテラル以外の文字列補間を使用することはできません。

これは:

string name = "bar";
string result = $"{name}";

これにコンパイルされます:

string name = "bar";
string result = string.Format("{0}", name);

実行時の文字列は、「通常の」形式の文字列である必要があり、文字列補間に相当するものではありません。

代わりに、単純な古いString.Formatを使用できます。

33
i3arnon

これを回避する1つのアプローチは、補間された文字列を含むラムダを使用することです。何かのようなもの:

Func<string, string> formatter = url => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);

C#7.0では、ラムダの代わりにローカル関数を使用して、コードを少しシンプルで効率的にすることができます。

string formatter(string url) => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);
24
svick

文字列補間は、ライブラリではなくコンパイラの機能です。

穴は名前ではなく式です。

var r = new Rectangle(5, 4);
var s = $"area: {r.Width + r.Heigh}":

あなたはローカライズのためにどうするつもりですか?

rさえもコンパイル時にのみ存在します。 ILでは、メソッドの変数スタック上の位置にすぎません。

リソースと構成ファイルに対してあなたがやろうとしていることをやった。

置換できる「変数」のセットは限られているため、配列(または必要に応じて辞書)を作成し、正規表現を使用して穴の名前をそのインデックスに置き換えました。書式指定子に許可したことさえしました。

3
Paulo Morgado

答えではなく、より多くのアイデア。

質問に示されている例では、次のことができます。

var format = "URL: ";
...
var url = "http://google.com";
...
var result= $"{format} {url}";

私はこのようなことをたくさんしなければならない実際のプロジェクトを持っています:

var label = "Some Label";
var value = "SomeValue";

//both label & value are results of some logic

var result = $"{label}: {value}";
0
Dimskiy