我打算使用逐字字符串,但我错误地输入$而不是@。

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

我想知道它是什么,有什么作用。我找过了,但什么也没找到。

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

string str = $"text\";

在c#中字符串前面的$字符是什么意思?

string str = $"text";

我使用Visual studio 2015 CTP。


当前回答

它创建了一个插值字符串。

从MSDN

用于构造字符串。插值字符串表达式看起来 比如包含表达式的模板字符串。一个插值 字符串表达式通过替换包含的字符串来创建字符串 表达式的ToString表示 结果。

ex :

 var name = "Sam";
 var msg = $"hello, {name}";

 Console.WriteLine(msg); // hello, Sam

可以在插值字符串中使用表达式

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

它的好处是,您不需要像使用String.Format那样担心参数的顺序。

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

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

请注意,好的旧字符串。如果您想在格式中指定文化信息,格式仍然是相关的。

其他回答

它比绳子更方便。格式,你也可以在这里使用智能感知。

下面是我的测试方法:

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

很酷的功能。我只是想强调一下为什么这个比字符串好。格式,如果对某些人来说不明显。

我看到有人说order string。格式为“{0}{1}{2}”以匹配参数。你不被迫订购“{0}{1}{2}”在字符串。格式,也可以做“{2}{0}{1}”。然而,如果你有很多参数,比如20,你真的想要将字符串排序为“{0}{1}{2}…”{19}”。如果它是一团乱,你将很难排列你的参数。

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

$的缺点是,你不能很容易地在字符串中重复参数,你必须输入它。例如,如果您厌倦了输入System.Environment。换行符,你可以做string.format(“…{0}{0}…{0}", System.Environment.NewLine),但是,在$中,你必须重复它。你不能用$"{0}"将它传递给字符串。格式,因为$"{0}"返回"0"。

在旁注,我读了另一个重复主题的评论。我不能发表评论,所以,这就是。他说

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

创建多个字符串对象。这其实是不对的。如果在单行中执行此操作,则它只创建一个字符串并放置在字符串缓存中。

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

它们都返回一个字符串,并且只在缓存中创建一个值。

另一方面:

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

在缓存中创建4个不同的值,因为有4个“;”。

因此,像下面这样写代码会更容易,但你会创建5个插值字符串Carlos Muñoz corrected:

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

这将在缓存中创建一个字符串,而您有非常容易阅读的代码。我不确定性能,但是,我相信微软会优化它,如果还没有这样做。

字符串中的$符号用于插值字符串的定义,这是c#中的一个特性,用于插值字符串是一个可能包含插值表达式的“真字符串”

为了获得更多信息,以下是答案和示例的来源: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

示例代码

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

它是插值字符串。可以在任何可以使用字符串字面量的地方使用插值字符串。当运行您的程序将使用插值字符串文字执行代码时,代码将通过计算插值表达式计算一个新的字符串文字。每次执行带有插值字符串的代码时都会进行此计算。

以下示例生成一个字符串值,其中所有字符串插值值都已计算完毕。它是最终结果,类型为string。所有出现的双大括号(“{{”和“}}”)都被转换为单个大括号。

string text = "World";
var message = $"Hello, {text}";

执行以上2行后,变量message包含“Hello, World”。

Console.WriteLine(message); // Prints Hello, World

参考资料- MSDN

它表示字符串插值。

它会保护你,因为它在字符串求值上增加了编译时间保护。

你将不再得到string.Format("{0}{1}",secondParamIsMissing)异常