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/