"$"符号在C#6.0中有什么作用?

Yve*_*ves 10 c# string-interpolation c#-6.0

在MVC 6源代码中,我看到一些代码行,其中包含带有$符号的字符串.

正如我之前从未见过的那样,我认为它是C#6.0中的新功能.我不确定.(我希望我是对的,否则我会感到震惊,因为我从来没有碰过它.

它就像:

var path = $"'{pathRelative}'";
Run Code Online (Sandbox Code Playgroud)

pau*_*ljz 18

你是对的,这是一个新的C#6功能.

$字符串前的符号启用字符串插值.编译器将特别解析字符串,并且将评估花括号内的任何表达式并将其插入到字符串中.

在引擎盖下,它转换为与此相同的东西:

var path = string.Format("'{0}'", pathRelative);
Run Code Online (Sandbox Code Playgroud)

让我们看一下这段代码的IL:

var test = "1";
var val1 = $"{test}";
var val2 = string.Format("{0}", test);
Run Code Online (Sandbox Code Playgroud)

编译为:

// var test = "1";
IL_0001: ldstr "1"
IL_0006: stloc.0

// var val1 = $"{test}";
IL_0007: ldstr "{0}"
IL_000c: ldloc.0
IL_000d: call string [mscorlib]System.String::Format(string, object)
IL_0012: stloc.1

// var val2 = string.Format("{0}", test);
IL_0013: ldstr "{0}"
IL_0018: ldloc.0
IL_0019: call string [mscorlib]System.String::Format(string, object)
IL_001e: stloc.2
Run Code Online (Sandbox Code Playgroud)

所以这两个在编译的应用程序中是相同的.


关于C#字符串插值语法的注释:不幸的是,现在对于字符串插值,水域变得混乱,因为最初的C#6预览具有不同的语法,早期在博客上得到了很多关注.您仍会看到很多使用反斜杠进行字符串插值的引用,但这在语法上不再有效.