字符串插值与格式变量

Cal*_*aNN 24 c# c#-6.0

我可以做这个:

var log = string.Format("URL: {0}", url);
Run Code Online (Sandbox Code Playgroud)

或者甚至喜欢这个

var format = "URL: {0}";
...
var log = string.Format(format, url);
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

无论如何使用字符串插值与先前声明的变量?

C#6似乎在编译期间内联字符串内联.但是,请考虑使用此功能进行本地化,在config中定义格式或仅const在类中使用格式.

i3a*_*non 33

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

因为这:

string name = "bar";
string result = $"{name}";
Run Code Online (Sandbox Code Playgroud)

编译成这样:

string name = "bar";
string result = string.Format("{0}", name);
Run Code Online (Sandbox Code Playgroud)

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

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


svi*_*ick 25

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

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

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

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


Pau*_*ado 5

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

洞不是名字,而是表达:

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

您将如何按照您的意图进行本地化?

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

我已经完成了您打算对资源和配置文件执行的操作。

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