我可以做这个:
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)
字符串插值是一个编译器,而不是库功能。
洞不是名字,而是表达:
var r = new Rectangle(5, 4);
var s = $"area: {r.Width + r.Heigh}":
Run Code Online (Sandbox Code Playgroud)
您将如何按照您的意图进行本地化?
甚至r
只存在于编译时。在 IL 中,它只是方法变量堆栈上的一个位置。
我已经完成了您打算对资源和配置文件执行的操作。
由于您只能有一组有限的“变量”来替代,我所做的是有一个数组(或字典,如果您愿意)并使用正则表达式将孔中的名称替换为其索引。我所做的甚至允许使用格式说明符。
归档时间: |
|
查看次数: |
20961 次 |
最近记录: |