我一直在看一本书中的一些c#练习,我偶然发现了一个难倒我的例子。直接从书中,输出行显示如下:

Console.WriteLine($"\n\tYour result is {result}.");

代码可以正常工作,双结果显示如预期的那样。然而,不理解为什么$在字符串的前面,我决定删除它,现在代码输出的是数组{result}的名称,而不是内容。不幸的是,这本书没有解释为什么会有$。

我一直在搜索VB 2015帮助和谷歌,关于字符串格式和控制台。WriteLine重载方法。我看不出有什么能解释它为什么是这样的。任何建议都将不胜感激。


字符串插值 是一个概念,像Perl这样的语言已经有一段时间了,而且 现在我们在c#中也可以得到这个功能。在字符串插值中,我们 简单地在字符串前面加上$(就像我们逐字使用@一样) 字符串)。然后,我们只需将想要的表达式环绕起来 用大括号(即{和})插值:

它看起来很像String.Format()占位符,但它不是一个索引,而是花括号内的表达式本身。事实上,它看起来像String.Format()并不奇怪,因为这就是它的全部——编译器在幕后像对待String.Format()一样对待的语法糖。

最重要的是,编译器现在为你维护占位符,所以你不必担心索引正确的参数,因为你只是把它放在字符串中。

c#字符串插值是一种连接、格式化和操作字符串的方法。该特性是在c# 6.0中引入的。使用字符串插值,我们可以使用对象和表达式作为字符串插值操作的一部分。

字符串插值的语法以' $ '符号开始,表达式使用以下语法在括号{}中定义。

{<interpolatedExpression>[,<alignment>][:<formatString>]}  

地点:

interpolatedExpression—产生要格式化的结果的表达式 对象的字符串表示形式中最小字符数的常量表达式 插值表达式的结果。如果是正数,则字符串 表示法是右对齐的;如果是负的,它是左对齐的。 formatString -表达式结果类型所支持的格式字符串。

下面的代码示例连接一个字符串,其中对象、author作为字符串插值的一部分。

string author = "Mohit";  
string hello = $"Hello {author} !";  
Console.WriteLine(hello);  // Hello Mohit !

阅读更多关于c# /的内容。NET小奇迹:c# 6中的字符串插值


这是c# 6中的新特性,称为插值字符串。

理解它最简单的方法是:插值字符串表达式通过将包含的表达式替换为表达式结果的ToString表示来创建字符串。

欲了解更多细节,请参阅MSDN。

现在,再想一下。为什么这个功能很棒?

例如,你有一个类Point:

public class Point
{
    public int X { get; set; }

    public int Y { get; set; }
}

创建2个实例:

var p1 = new Point { X = 5, Y = 10 };
var p2 = new Point { X = 7, Y = 3 };

现在,你想把它输出到屏幕上。你通常使用的两种方法:

Console.WriteLine("The area of interest is bounded by (" + p1.X + "," + p1.Y + ") and (" + p2.X + "," + p2.Y + ")");

如您所见,这样的串接字符串使代码难以阅读且容易出错。你可以使用string.Format()来使它更好:

Console.WriteLine(string.Format("The area of interest is bounded by({0},{1}) and ({2},{3})", p1.X, p1.Y, p2.X, p2.Y));

这就产生了一个新问题:

您必须自己维护参数的数量和索引。如果参数和索引的数量不相同,它将生成一个运行时错误。

基于这些原因,我们应该使用新的特性:

Console.WriteLine($"The area of interest is bounded by ({p1.X},{p1.Y}) and ({p2.X},{p2.Y})");

编译器现在为你维护占位符,所以你不必担心索引正确的参数,因为你只是把它放在字符串中。

完整的文章,请阅读这个博客。