目前通用的使用格式字符串都是使用String.Format()函数来完成的,如:
int old = 29;
var str = string.Format("My Age: {0}", old);
当需要的参数比较多时,比较容易因为参数位置而引起错误,因为格式字符串的序号与params数组的位置要对应,不管是写代码的人还是阅读代码的人,都会比较费劲的确认字符串是不是按照正确的顺序排列,毕竟手工的操作,总是犯错会多一点。
在C# 6.0时,提供了内插字符串(Interpolated String)的语法糖,内插字符串以$开头,它不像传统的格式字符串那样把序号放在一对花括号里面,并且其只带params数组中的对应元素,而是可以直接在花括号里面编写C#表达式,如:
int old = 29;
var str = $"My Age: {old}";
在处理字符串时,有时候会需要对浮点数等按指定格式显示,如显示两位有效数字等,以前用string.Format()时候也有,如:
var mathDesc = string.Format("PI's value = {0: F2}", Math.PI);
这么好用的东西,内插字符串也少不了的:
var mathDesc2 = $"PI's value = {Math.PI.ToString("F2")}";
或者:
var mathDesc2 = $"PI's value = {Math.PI: F2}";
使用ToString()函数转换为数据,是因为字符串内插操作所生成的代码会调用参数为params对象数组的格式化方法,如果参数是值类型,必须自动转成Object类型才行,这样就会存在装箱操作,如果代码调用频繁,很容易成为性能瓶颈。
内插字符串机制还有很多其他的功能,只要是有效的C#表达式,就可以在字符串的花括号里面。如:
var info = $"The name is {test?.MyName ?? "Name is missing"}";
这样可以提供很灵活的使用方法,出错的概率也降低很多。
文本的显示通常也需要做本地化的处理,C#提供了对不同区域文本支持的机制。FormattableString提供了这样的方便,FormattableString会采用特定的区域和语言设置,然后通过string.Format()方法做出转换。
public static string ToGerman(FormattableString src)
{
return string.Format(null,
System.Globalization.CultureInfo.CreateSpecificCulture("de-de"),
src.Format,
src.GetArguments());
}
网友评论