Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#6.0';s字符串插值依赖于反射吗?_C#_String Interpolation_C# 6.0 - Fatal编程技术网

C#6.0';s字符串插值依赖于反射吗?

C#6.0';s字符串插值依赖于反射吗?,c#,string-interpolation,c#-6.0,C#,String Interpolation,C# 6.0,简明扼要。C#6.0中新的字符串插值依赖于反射吗?也就是说 string myStr = $"Hi {name}, how are you?"; 在运行时使用反射查找变量“name”及其值?否。它没有。它完全基于编译时评估 您可以看到,有了它,编译和反编译: int name = 4; string myStr = $"Hi {name}, how are you?"; 为此: int num = 4; string.Format("Hi {0}, how are you?", num);

简明扼要。C#6.0中新的字符串插值依赖于反射吗?也就是说

string myStr = $"Hi {name}, how are you?";

在运行时使用反射查找变量“name”及其值?

否。它没有。它完全基于编译时评估

您可以看到,有了它,编译和反编译:

int name = 4;
string myStr = $"Hi {name}, how are you?";
为此:

int num = 4;
string.Format("Hi {0}, how are you?", num);

字符串插值还支持使用
IFormattable
,因此()如下:

变成这样:

int num = 4;
FormattableStringFactory.Create("Hi {0}, how are you?", new object[] { num });
说明它是基于编译时的(并在内部调用
string.Format()

字符串插值在编译时转换为调用等效的String.Format调用。这与以前一样保留了对本地化的支持(尽管仍然使用复合格式字符串),并且不会通过字符串引入任何编译后代码注入


为什么需要?编译器拥有它所需要的所有信息。如果变量名
name
在作用域中,则将使用它,否则将出现错误。我不知道,这就是我问的原因。我不确定格式字符串是否按“原样”保存在二进制中,然后将填充空格(在经典情况下为{0}等(带变量)如果是这样的话,那么它就必须使用反射,但我不知道编译器是如何处理这些语句的。我不知道,但可以肯定的是,我会偷看一个反编译器,比如dotPeek,看看发生了什么。你可以说,反射无法检测字符串文本上的
$
。只有编译器才能看到它。Which告诉它解析字符串,在字符串中查找
{identifier}
,并生成相应的string.Format()语句。谢谢!我正要问它是否完全等同于字符串。Format,但这个TryRoslyn示例让一切都更清楚了:)将尽快接受。@i3arnon,我很惊讶
$“嗨{0},你好吗?”
编译并将
0
作为
string.Format
的参数。很明显,为什么编译器允许您将代码放入其中:
$“嗨{friend.GiveMeYourName()},你好吗?”。但在数字运算能力背后的推理是非常有趣的。@LeonidVasilyev为什么?这只是一个表达。为什么编译器的行为应该有所不同?这将是一行有趣的代码,但编译器应该允许您编写。@i3arnon name vs num-typo?@laktak No。这是TryRoslyn工具的结果。数字可能是
num
,因为它是
int
int num = 4;
FormattableStringFactory.Create("Hi {0}, how are you?", new object[] { num });