string之前的$是什么意思?

我打算使用逐字string,但是我错误地键入$而不是@

但编译器没有给我任何错误,并成功编译。

我想知道它是什么,它是做什么的。 我search了它,但我找不到任何东西。

然而,它不像一个逐字string,因为我不能写:

 string str = $"text\"; 

有没有人知道在C#之前的string代表什么$

 string str = $"text"; 

我正在使用Visual Studio 2015 CTP。

$String.Format缩写,用于string插值,这是C#6的一个新特性。在你的情况下,它什么也不做,就像string.Format()什么也不做。

它是用来build立参考其他值的string。 以前必须写成:

 var anInt = 1; var aBool = true; var aString = "3"; var formated = string.Format("{0},{1},{2}", anInt, aBool, aString); 

现在变成:

 var anInt = 1; var aBool = true; var aString = "3"; var formated = $"{anInt},{aBool},{aString}"; 

还有一种替代方法 – 不那么有名的 – 使用$@的string插值forms(这两个符号的顺序很重要)。 它允许@""string的特征与$""混合,以支持string插值,而不需要整个string中的\\ 。 所以下面两行:

 var someDir = "a"; Console.WriteLine($@"c:\{someDir}\b\c"); 

会输出:

 c:\a\b\c 

它创build一个插入的string 。

来自MSDN

用于构buildstring。 插入的stringexpression式看起来像包含expression式的模板string。 插入的stringexpression式通过用expression式结果的ToString表示replace包含的expression式来创buildstring。

例如:

  var name = "Sam"; var msg = $"hello, {name}"; Console.WriteLine(msg); // hello, Sam 

您可以使用插值string中的expression式

  var msg = $"hello, {name.ToLower()}"; Console.WriteLine(msg); // hello, sam 

关于它的好处是你不需要担心参数的顺序,就像你使用String.Format

  var s = String.Format("{0},{1},{2}...{88}",p0,p1,..,p88); 

现在,如果你想删除一些参数,你必须去更新所有的计数,这是不是现在的情况。

请注意,如果您想要在格式中指定文化信息,那么旧的string.format仍然是相关的。

它是插值string 。 您可以在任何可以使用string文字的地方使用插入的string。 在运行程序时,将使用插值string文字执行代码,代码将通过评估插值expression式来计算新的string文字。 每次执行插入string的代码时都会执行此计算。

 var message = $"Sample, {text}"; 

此示例生成一个string值,其中计算了所有string插值。 这是最后的结果,并有string。 所有出现的双花括号(“{{“ and “}}”)被转换为一个大花括号。

如果,

 string text = "One"; 

然后message包含“Sample,One”。

 Console.WriteLine(message); // Sample, One 

 public class Person { public String firstName { get; set; } public String lastName { get; set; } } // Instantiate Person var person = new Person { firstName = "Albert", lastName = "Einstein" }; // We can print fullname of the above person as follows Console.WriteLine("Full name - " + person.firstName + " " + person.lastName); Console.WriteLine("Full name - {0} {1}", person.firstName, person.lastName); Console.WriteLine($"Full name - {person.firstName} {person.lastName}"); 

产量

 Full name - Albert Einstein Full name - Albert Einstein Full name - Albert Einstein 

参考 – MSDN

请注意,您也可以将两者结合起来,这很酷(虽然看起来有点奇怪):

 // simple interpolated verbatim string WriteLine($@"Path ""C:\Windows\{file}"" not found."); 

它比string.Format更方便,你也可以在这里使用intellisense。

在这里输入图像描述

这里是我的testing方法:

 [TestMethod] public void StringMethodsTest_DollarSign() { string name = "Forrest"; string surname = "Gump"; int year = 3; string sDollarSign = $"My name is {name} {surname} and once I run more than {year} years."; string expectedResult = "My name is Forrest Gump and once I run more than 3 years."; Assert.AreEqual(expectedResult, sDollarSign); } 

我不知道它是如何工作的,但你也可以使用它来select你的价值!

例如:

 Console.WriteLine($"I can tab like {"this !", 5}."); 

当然,你可以取代“这个!” 与任何variables或任何有意义的,就像你也可以改变标签。

它表示string插值。

它会保护你,因为它正在为string评估增加编译时间保护。

你不会再用string.Format("{0}{1}",secondParamIsMissing)

很酷的function。 我只想强调一下,为什么这比string.format更好,如果对某些人来说是不明显的。

我读了一个说string.format到“{0} {1} {2}”来匹配参数的人。 您不必在string.format中订购“{0} {1} {2}”,您也可以执行“{2} {0} {1}”。 但是,如果有很多参数(如20),则确实需要将stringsorting为“{0} {1} {2} … {19}”。 如果这是一个混乱的混乱,你将很难排队你的参数。

使用$,可以添加内联参数而不用计算参数。 这使代码更容易阅读和维护。

$的缺点是,你不能轻易地重复string中的参数,你必须input它。 例如,如果您厌倦了inputSystem.Environment.NewLine,则可以执行string.format(“… {0} … {0} … {0}”,System.Environment.NewLine),但是,在$,你必须重复。 你不能做$“{0}”并把它传递给string.format,因为$“{0}”返回“0”。

在旁注中,我已经读了另一个重复的tpoic的评论。 我无法评论,所以,这是。 他说过

 string msg = n + " sheep, " + m + " chickens"; 

创build多个string对象。 实际上这是不正确的。 如果单行执行此操作,它只会创build一个string并放入stringcaching中。

 1) string + string + string + string; 2) string.format() 3) stringBuilder.ToString() 4) $"" 

所有这些都返回一个string,只在caching中创build一个值。

另一方面:

 string+= string2; string+= string2; string+= string2; string+= string2; 

在caching中创build4个不同的值,因为有4个“;”。

因此,编写这样的代码会更容易:

 string msg = $"Hello this is {myName}, " + "My phone number {myPhone}, " + "My email {myEmail}, " + "My address {myAddress}, and " + "My preference {myPreference}."; 

这将在caching中创build一个单独的string,同时您可以非常轻松地读取代码。 我不确定的performance,但是,我相信MS会优化它,如果还没有这样做。

 using System; public class Example { public static void Main() { var name = "Horace"; var age = 34; var s1 = $"He asked, \"Is your name {name}?\", but didn't wait for a reply."; Console.WriteLine(s1); var s2 = $"{name} is {age:D3} year{(age == 1 ? "" : "s")} old."; Console.WriteLine(s2); } } // The example displays the following output: // He asked, "Is your name Horace?", but didn't wait for a reply. // Horace is 034 years old. 

$语法很好,但有一个缺点。

如果你需要类似于string模板的东西,那就是在类层次上声明为字段…以及它应该在一个地方。

然后你必须在同一层次上声明variables……这不是很酷。

使用这种types的string.Format语法更好

 class Example1_StringFormat { string template = $"{0} - {1}"; public string FormatExample1() { string some1 = "someone"; return string.Format(template, some1, "inplacesomethingelse"); } public string FormatExample2() { string some2 = "someoneelse"; string thing2 = "somethingelse"; return string.Format(template, some2, thing2); } } 

全局的使用不是很好

  class Example2_$Format { //must have declaration in same scope string some = ""; string thing = ""; string template = $"{some} - {thing}"; public string FormatExample1() { some = "someone"; thing = "something"; return template; } public string FormatExample2() { some = "someoneelse"; thing = "somethingelse"; return template; } }