C#6.0 字符串插值本地化

标签 c# .net c#-6.0

C#6.0 有一个 string interpolation - 格式化字符串的一个很好的功能,例如:

 var name = "John";
 WriteLine($"My name is {name}");

示例转换为

 var name = "John";
 WriteLine(String.Format("My name is {0}", name));

从本地化的角度来看,存储这样的字符串要好得多:

"My name is {name} {middlename} {surname}" 

比 String.Format 表示法:

"My name is {0} {1} {2}"

.NET本地化如何使用字符串插值?有没有办法将 $"..."放入资源文件?或者字符串应该像“...{name}”一样存储并以某种方式动态插入?

附言这个问题不是关于“如何制作 string.FormatIt 扩展名”(有很多这样的库,所以答案等)。这个问题是关于“本地化”上下文中“字符串插值”的 Roslyn 扩展(两者都是 MS .NET 词汇表中的术语),或者像 Dylan 提议的动态用法。

最佳答案

内插字符串将大括号之间的 block 计算为 C# 表达式(例如 {expression}{1 + 1}{person.FirstName }).

这意味着内插字符串中的表达式必须引用当前上下文中的名称。

例如这个语句将不会编译:

var nameFormat = $"My name is {name}"; // Cannot use *name*
                                       // before it is declared
var name = "Fred";
WriteLine(nameFormat);

类似地:

class Program
{
    const string interpolated = $"{firstName}"; // Name *firstName* does not exist
                                                // in the current context
    static void Main(string[] args)
    {
        var firstName = "fred";
        Console.WriteLine(interpolated);
        Console.ReadKey();
    }
}

回答你的问题:

框架目前没有提供在运行时评估内插字符串的机制。因此,您不能开箱即用地存储字符串和动态插值。

存在处理字符串运行时插值的库。

关于C#6.0 字符串插值本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068194/

相关文章:

.net - 我什么时候应该使用 SQLTransaction

c# - 属性是否需要显式初始化?

c# - 使用 Selenium 3 启动特定的 Firefox 配置文件

c# - Resharper 提示/技巧...这可能吗?

c# - 是否有任何 linqish 方式来保存用户表单数据 - 重构我的代码

c# - CloudBlob.DownloadText 方法插入附加字符?

.net - 如何修复 COMException 错误 80040154?

c# - 字符串插值问题

c# - .net framework 4 中的 nameof 表达式

C# 删除行后在 RichTextBox 中丢失字体样式