【问题标题】:String interpolation inside string interpolation字符串插值内的字符串插值
【发布时间】:2015-11-20 14:42:21
【问题描述】:

是否可以有一个你想要插值的字符串格式的变量。

public class Setting
{
    public string Format { get; set; }
}


var setting = new Setting { Format = "The car is {colour}" };
var colour = "black";
var output = $"{setting.Format}";

预期输出

“这辆车是黑色的”。

【问题讨论】:

  • 使用string.Format。如果你有变量而不是常量。而且你不能一边吃蛋糕一边吃。
  • 人们为此编写了一堆扩展方法。 FormatWith 或类似名称。请注意,这些自定义函数中的每一个都有slightly different behavior。另见Named Formats Redux

标签: c# string-interpolation c#-6.0


【解决方案1】:

你不能那样做。字符串插值是一个纯粹的编译时特性。

【讨论】:

    【解决方案2】:

    不,你不能这样做,但你可以用稍微不同的方法来达到同样的效果,我喜欢:

    public class Setting
    {
        public Func<string, string> Format { get; set; }
    }
    

    然后你可以将你的字符串参数传递给Format:

    var setting = new Setting { Format = s => $"The car is {s}" };
    var output = setting.Format("black");
    

    【讨论】:

    • 编译器基本变成Setting { Format = s =&gt; string.Format("The car is {0}", s) };
    【解决方案3】:

    为什么不呢?
    首先,在 C# 中声明局部变量之前,不能使用它。所以 在使用之前先声明colour。然后“插入”分配给Format 的字符串,就完成了。

    var colour = "black";
    var setting = new Setting { Format = $"The car is {colour}" };
    var output = $"{setting.Format}";
    Console.WriteLine(output);
    

    输出:

    这辆车是黑色的。

    【讨论】:

    • 我喜欢这个,但是你的变化太微妙了,你能为未来的读者详细说明一下吗?
    【解决方案4】:

    你可以对它做些小改动,如下所示:

    public class Setting
    {
        public string Format
        { 
            get
            {
                return String.Format(this.Format, this.Colour);
            }
            set
            {
                Format = value;
            }
        }
    
        public string Colour { get; set; }
    }
    
    
    var setting = new Setting { Format = "The car is {0}", Colour = "black" };
    

    那么输出将是“汽车是黑色的”。

    我没有测试过这段代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多