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调用。 这保留了以前对本地化的支持(尽管仍然使用复合格式字符串),并且不会通过字符串引入任何后编译注入代码。