【问题标题】:String Interpolation with format variable带格式变量的字符串插值
【发布时间】:2015-11-28 09:23:41
【问题描述】:

我可以这样做:

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.Format
  • 您必须使用您一直在使用的“旧方式”或将其包装到私有方法中。

标签: c# c#-6.0


【解决方案1】:

不,您不能将字符串插值与字符串文字以外的内容一起使用,因为即使您使用字符串插值,编译器也会创建“常规”格式字符串。

因为:

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

编译成这样:

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

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

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

【讨论】:

  • 我同意了。我认为逻辑上"{name}""{0}" 的映射首先可以在运行时完成,但string.Format 参数应该内联编译。所以我不能简单地在变量中动态引入新的{name2}
  • 但至少它应该接受const string。然后编译器可以找出"{...}" 标记并构造string.Format 参数。总之,没什么大不了的。
  • @CallMeLaNN 这在方法内部定义了 const 时才起作用,以便编译器可以解析(和验证)占位符。否则,如果它的占位符仅存在于 methods 中,编译器如何确定 class-level 常量字符串是否有效?
【解决方案2】:

解决此问题的一种方法是使用包含内插字符串的 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);

【讨论】:

    【解决方案3】:

    字符串插值不是库,而是从 C# 6 开始的编译器功能。

    孔不是名字,而是表达式:

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

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

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

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

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

    【讨论】:

    • 在您的示例中,本地化部分是 "area: "。但是 +1 用于提及表达。
    【解决方案4】:

    这应该是对 i3arnon 答案的评论,但我没有声誉 :-( : 但是对于那些来到这个旧线程的人来说,在 string.Format 中,格式可以是一个变量:

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

    有效。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        看来你可以这样做:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-15
          • 1970-01-01
          • 2019-06-03
          • 1970-01-01
          • 2022-01-20
          • 2015-06-19
          • 2022-07-05
          相关资源
          最近更新 更多