带格式变量的字符串插值

本文关键字:字符串 插值 变量 格式 | 更新日期: 2023-09-27 18:10:50

我可以这样做:

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格式。

带格式变量的字符串插值

不,即使使用字符串插值,编译器也会创建一个"常规"格式字符串,因此您不能将字符串插值与字符串字面量以外的东西一起使用。

因为这个:

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

被编译成这样:

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

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

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

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

Func<string, string> 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);

字符串插值不是库,而是从c# 6开始的编译器特性。

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

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

你打算如何为本地化做那个?

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

我已经完成了你想为资源和配置文件做的事情。

因为你只能有一个有限的"变量"集合为了进行替换,我所做的是使用一个数组(或者字典,如果您喜欢的话),并使用正则表达式用它的索引替换孔中的名称。我所做的甚至允许格式说明符

这应该是对i3arnon的回答的评论,但我没有声誉:-(:但对于那些来到这条古老的线,在弦。格式可以是一个变量:

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

您可以使用正确的Nuget包:https://www.nuget.org/packages/InterpolatedStringFormatter

var mystring = "a thing(and something {other})";
Console.WriteLine(mystring.Interpolate("else"));

输出:

a thing(and something else)

更多的是一个想法而不是一个答案。

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

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

查看更多详细信息