C#6.0的字符串插值是否依赖于Reflection?
简短而简单。 C#6.0中的新字符串插值是否依赖于reflection? 即
string myStr = $"Hi {name}, how are you?";
在运行时使用reflection来查找变量“name”及其值?
不,它没有。 它完全基于编译时评估。
你可以看到这个TryRoslyn示例编译和反编译:
int name = 4; string myStr = $"Hi {name}, how are you?";
进入这个:
int num = 4; string.Format("Hi {0}, how are you?", num);
字符串插值也支持使用IFormattable
作为结果( 再次使用TryRoslyn ):
int name = 4; IFormattable myStr = $"Hi {name}, how are you?";
变成这样:
int num = 4; FormattableStringFactory.Create("Hi {0}, how are you?", new object[] { num });
本文解释它是基于编译时的(并在内部调用string.Format()
。引用:
在编译时转换字符串插值以调用等效的string.Format调用。 这保留了以前对本地化的支持(尽管仍然使用复合格式字符串),并且不会通过字符串引入任何后编译注入代码。