字符串插值与格式变量

时间:2015-09-02 18:18:20

标签: c# c#-6.0

我可以这样做:

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似乎在编译期间内联字符串内联。但是,请考虑使用此功能进行本地化,在配置中定义格式或在类中只使用格式const

6 个答案:

答案 0 :(得分:32)

不,你不能使用字符串插值而不是字符串文字,因为编译器会创建一个"常规"即使使用字符串插值也格式化字符串。

因为:

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

编译成:

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

运行时的字符串必须是"常规"格式化字符串,而不是字符串插值等效。

您可以使用普通的String.Format代替。

答案 1 :(得分:24)

解决这个问题的一种方法是使用包含插值字符串的lambda。类似的东西:

toggleProperty

在C#7.0中,您可以使用本地函数而不是lambda,以使代码更简单,更高效:

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

答案 2 :(得分:3)

字符串插值是一种编译器,而不是库的功能。

这些洞不是名字,而是表达式:

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

您打算如何进行本地化?

偶数r仅在编译时存在。在IL中,它只是方法变量堆栈的一个位置。

我已经完成了您打算为资源和配置文件做的事情。

因为你只能拥有一组有限的&#34;变量&#34;替换,我所做的是有一个数组(或字典,如果你愿意)并使用正则表达式用它的索引替换孔中的名称。我甚至允许格式说明符。

答案 3 :(得分:0)

更多的是想法,而不是答案。

对于问题中显示的示例,您可以执行以下操作。

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}";

答案 4 :(得分:0)

这应该是对i3arnon答案的评论,但我没有声誉:-(: 但是对于那些使用旧线程的人,使用string.Format格式可以是一个变量:

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

有效。

答案 5 :(得分:-4)

似乎你可以这样做:

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

System.Console.WriteLine(url);

您可以在https://msdn.microsoft.com/en-us/library/dn961160.aspx

中查看更多详情