字符串插值与格式变量

我可以做这个:

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

不,您不能使用字符串插值而不是字符串文字,因为即使您使用字符串插值,编译器也会创建“常规”格式字符串。

因为这:

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

编译成这样:

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

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

您可以使用普通的旧String.Format

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

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

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

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

字符串插值是编译器,而不是库,function。

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

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

你打算如何为本地化做到这一点?

甚至r只存在于编译时。 在IL中,它只是方法的变量堆栈上的一个位置。

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

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

更多的想法而不是答案。

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

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

看来你可以这样做:

 var googleUrl = "http://google.com"; var url = $"URL: {googleUrl}"; System.Console.WriteLine(url); 

您可以在https://msdn.microsoft.com/en-us/library/dn961160.aspx查看更多详细信息。