繁体   English   中英

字符串前的 $ 是什么意思?

[英]What does $ mean before a string?

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

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

我想知道它是什么以及它的作用。 我搜索了它,但我找不到任何东西。

但是,它不像逐字字符串,因为我不会写:

string str = $"text\";

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

string str = $"text";

我正在使用 Visual Studio 2015 CTP。

$String.Format的简写,并与字符串插值一起使用,这是 C# 6 的一个新功能。在您的情况下,它什么都不做,就像string.Format()什么都不做一样。

当用于参考其他值构建字符串时,它会发挥自己的作用。 以前必须写成:

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

还有一种替代方式——鲜为人知——使用$@的字符串插值形式(两个符号的顺序很重要)。 它允许将@""字符串的功能与$""混合以支持字符串插值,而无需在整个字符串中使用\\ 所以以下两行:

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

将输出:

c:\a\b\c

它创建一个内插字符串

来自MSDN

用于构造字符串。 内插字符串表达式看起来像包含表达式的模板字符串。 内插字符串表达式通过将包含的表达式替换为表达式结果的 ToString 表示来创建字符串。

前任 :

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

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

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

示例代码

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

它是插值字符串 您可以在任何可以使用字符串文字的地方使用内插字符串。 当运行您的程序将使用插值字符串文字执行代码时,代码通过评估插值表达式来计算新的字符串文字。 每次执行带有内插字符串的代码时都会发生这种计算。

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

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

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

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

参考 - MSDN

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

我读到有人说 order string.format to "{0} {1} {2}" 以匹配参数。 您不必以 string.format 格式订购“{0} {1} {2}”,您也可以订购“{2} {0} {1}”。 但是,如果您有很多参数,例如 20,您确实希望将字符串排序为“{0} {1} {2} ... {19}”。 如果它是一个乱七八糟的混乱,你将很难排列你的参数。

使用 $,您可以在不计算参数的情况下添加内联参数。 这使得代码更容易阅读和维护。

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

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

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 个“;”。

因此,编写如下代码会更容易,但您将创建五个插值字符串,因为 Carlos Muñoz 更正了:

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

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

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

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

它表示字符串插值。

它将保护您,因为它在字符串评估中添加了编译时间保护。

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

它比 string.Format 更方便,你也可以在这里使用智能感知。

在此处输入图像描述

这是我的测试方法:

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

以下示例突出了使用插值字符串优于string.Format()的各种优点,就清洁度和可读性而言。 它还表明{}中的代码像任何其他函数参数一样被评估,就像我们被调用的string.Format()一样。

using System;

public class Example
{
   public static void Main()
   {
      var name = "Horace";
      var age = 34;
      // replaces {name} with the value of name, "Horace"
      var s1 = $"He asked, \"Is your name {name}?\", but didn't wait for a reply.";
      Console.WriteLine(s1);

      // as age is an integer, we can use ":D3" to denote that
      // it should have leading zeroes and be 3 characters long
      // see https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-pad-a-number-with-leading-zeros
      //
      // (age == 1 ? "" : "s") uses the ternary operator to 
      // decide the value used in the placeholder, the same 
      // as if it had been placed as an argument of string.Format
      //
      // finally, it shows that you can actually have quoted strings within strings
      // e.g. $"outer { "inner" } string"
      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.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);
 }
}

全局变量的使用不是很好,除此之外 - 它也不适用于全局变量

 static class Example2_Format {
 //must have declaration in same scope
 static string some = "";
 static string thing = "";
 static string template = $"{some} - {thing}";

//This returns " - " and not "someone - something" as you would maybe 
//expect
 public static string FormatExample1() {
   some = "someone";
   thing = "something";
   return template;
 }

//This returns " - " and not "someoneelse- somethingelse" as you would 
//maybe expect
 public static string FormatExample2() {
   some = "someoneelse";
   thing = "somethingelse";
   return template;
 }
}

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

例子 :

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

当然,您可以替换“this!” 任何变量或任何有意义的东西,就像您也可以更改选项卡一样。

字符串中的 $ 符号用于定义插值字符串,它是 C# 中用于插值字符串的功能,它是可能包含插值表达式的“真字符串”

有关更多信息,这是答案和示例的来源: https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM