美元符号($"string")是做什么的?
本文关键字:quot 什么 符号 美元 string | 更新日期: 2023-09-27 18:15:19
我一直在看一本书中的一些c#练习,我遇到了一个难倒我的例子。直接从书中,输出行显示为:
Console.WriteLine($"'n'tYour result is {result}.");
代码正常工作,double result
显示如预期。然而,不理解为什么$
在字符串的前面,我决定删除它,现在代码输出数组{result}
的名称而不是内容。不幸的是,这本书没有解释为什么$在那里。
我一直在搜索VB 2015帮助和谷歌,关于字符串格式化和Console.WriteLine
过载方法。我没有看到任何解释它为什么是这样的东西。如有任何建议,不胜感激。
这是c# 6中名为Interpolated Strings
的新特性。
最简单的理解方法是:插入字符串表达式通过用表达式结果的ToString表示替换包含的表达式来创建字符串。
有关此内容的详细信息,请查看MSDN。
现在,再多想一点。为什么这个特性很棒?
例如,您有一个类Point
:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
创建两个实例:
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})");
编译器现在为您维护占位符,因此您不必担心索引正确的参数,因为您只需将其放在字符串中。
字符串插值是Perl等语言很久以前就有的一个概念现在我们也将在c#中获得这种能力。在字符串插值中,我们只需在字符串前加上$(就像我们使用@表示逐字记录一样)字符串)。然后,我们简单地包围我们想要的表达式插入花括号(即{和}):
它看起来很像String.Format()占位符,但它不是索引,而是花括号内的表达式本身。事实上,它看起来像String.Format()并不奇怪,因为它实际上就是这样——编译器在幕后像对待String.Format()一样对待它的语法糖。
一个重要的部分是,编译器现在为你维护占位符,所以你不必担心索引正确的参数,因为你只需要把它放在字符串中。
c#字符串插值是一种串接、格式化和操作字符串的方法。这个特性是在c# 6.0中引入的。使用字符串插值,我们可以使用对象和表达式作为字符串插值操作的一部分。字符串插值的语法以' $ '符号开始,表达式在括号{}中定义,使用以下语法。
{<interpolatedExpression>[,<alignment>][:<formatString>]}
地点:
- interpolateexpression -生成要格式化的结果的表达式
- alignment -常量表达式,其值定义的字符串表示的最小字符数插值表达式的结果。如果为正,则字符串表示是右对齐的;
- formatString -表达式结果类型支持的格式字符串。
下面的代码示例连接一个字符串,其中对象,author作为字符串插值的一部分。
string author = "Mohit";
string hello = $"Hello {author} !";
Console.WriteLine(hello); // Hello Mohit !
阅读更多关于c#/。. NET Little Wonders: c# 6中的字符串插值