带格式变量的字符串插值
String Interpolation with format variable
我能做到:
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 似乎在编译期间插入内联字符串。但是考虑使用此功能进行本地化,在配置中定义格式或简单地在 class.
中使用格式 const
不,您不能对字符串文字以外的其他内容使用字符串插值,因为即使您使用字符串插值,编译器也会创建 "regular" 格式字符串。
因为这个:
string name = "bar";
string result = $"{name}";
编译成这样:
string name = "bar";
string result = string.Format("{0}", name);
运行时的字符串必须是 "regular" 格式字符串,而不是等效的字符串插值。
您可以改用普通的旧 String.Format
。
看来你可以这样做:
var googleUrl = "http://google.com";
var url = $"URL: {googleUrl}";
System.Console.WriteLine(url);
中查看更多详细信息
解决此问题的一种方法是使用包含内插字符串的 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 中,它只是方法变量堆栈上的一个位置。
我已经完成了您打算对资源和配置文件执行的操作。
因为你只能用一组有限的“变量”来替换,我所做的是有一个数组(或者字典,如果你愿意的话)并使用正则表达式用它的索引替换孔中的名称.我所做的甚至允许格式说明符。
更多的是想法而不是答案。
对于问题中显示的示例,您可以执行以下操作。
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}";
这应该是对 i3arnon 的回答的评论,但我没有声望:-( :
但是对于那些来到这个旧线程的人来说,在 string.Format 中格式可以是一个变量:
string name = "bar";
string format = "{0}";
string result = string.Format(format, name);
有效。
我能做到:
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 似乎在编译期间插入内联字符串。但是考虑使用此功能进行本地化,在配置中定义格式或简单地在 class.
中使用格式const
不,您不能对字符串文字以外的其他内容使用字符串插值,因为即使您使用字符串插值,编译器也会创建 "regular" 格式字符串。
因为这个:
string name = "bar";
string result = $"{name}";
编译成这样:
string name = "bar";
string result = string.Format("{0}", name);
运行时的字符串必须是 "regular" 格式字符串,而不是等效的字符串插值。
您可以改用普通的旧 String.Format
。
看来你可以这样做:
var googleUrl = "http://google.com";
var url = $"URL: {googleUrl}";
System.Console.WriteLine(url);
中查看更多详细信息
解决此问题的一种方法是使用包含内插字符串的 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 中,它只是方法变量堆栈上的一个位置。
我已经完成了您打算对资源和配置文件执行的操作。
因为你只能用一组有限的“变量”来替换,我所做的是有一个数组(或者字典,如果你愿意的话)并使用正则表达式用它的索引替换孔中的名称.我所做的甚至允许格式说明符。
更多的是想法而不是答案。
对于问题中显示的示例,您可以执行以下操作。
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}";
这应该是对 i3arnon 的回答的评论,但我没有声望:-( : 但是对于那些来到这个旧线程的人来说,在 string.Format 中格式可以是一个变量:
string name = "bar";
string format = "{0}";
string result = string.Format(format, name);
有效。