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; } }