字符串{0}中的大括号

m.e*_*son 11 c# string curly-braces

我经常在一个通常包含数字的字符串中看到花括号,例如:

string something = "I have {0} cats";
Run Code Online (Sandbox Code Playgroud)

虽然我可以弄清楚这意味着什么,但我可以说我从来没有读过任何与其用法有关的文件.c#字符串文档似乎没有任何与这些相关的信息.谁能指出我正确的方向?

Rya*_*ett 20

在string.Format中用作值参数的占位符.string.Format("我有{0}猫",5); 打印"我有5只猫"

所以你可以使用string.Format(something,5); 并得到与上面相同的结果


Mat*_*lia 12

它是使用的普通格式字符串String.Format,称为"复合格式".有关它的更多信息,请看这里.


ruf*_*fin 5

*对于C#6.0和朋友来说,花括号不再仅仅是string.Format一个了!现在它们可以表示插值的字符串,您可以在其中混合C#对象和代码而无需所有string.Format{0} {1} {2}开销。

注意:内插字符串以美元符号开头$

上面链接的语言参考页面

用于构造字符串。插值字符串看起来像包含插值表达式的模板字符串。插值字符串返回一个字符串,该字符串将其包含的插值表达式替换为其字符串表示形式。

插值字符串的参数比复合格式的字符串更易于理解。例如,内插字符串

Console.WriteLine($"Name = {name}, hours = {hours:hh}");

包含两个内插表达式,“ {name}”和“ {hours:hh}”。等效的复合格式字符串为:

Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours);

注意:如果您不知道,Console.WriteLine它具有某种内置的string.Format,如果您不知道该内置的话,在上面的示例中可能并不明显。

如果您想在不依赖Console.WriteLine魔术的情况下获取相同的字符串,则可能更容易理解以下内容:

string message = $"Name = {name}, hours = {hours:hh}"; // interpolated
Run Code Online (Sandbox Code Playgroud)

...相当于...

string message = string.Format("Name = {0}, hours = {1:hh}", name, hours); // old school
Run Code Online (Sandbox Code Playgroud)

插值字符串的结构为:

$"<text> {<interpolated-expression> [,<field-width>] [<:format-string>] } <text> ..."
哪里:

  • field-width是一个带符号的整数,指示字段中的字符数。如果为正,则该字段为右对齐;否则为0。如果为负,则左对齐。
  • format-string是适合于要格式化的对象类型的格式字符串。例如,对于DateTime值,它可以是标准的日期和时间格式字符串,例如“ D”或“ d”。

您可以在任何可以使用字符串文字的地方使用内插字符串。每次执行带有插值字符串的代码时,都会评估插值字符串。这使您可以分隔插值字符串的定义和评估。

要在插入的字符串中包含大括号(“ {”或“}”),请使用两个大括号“ {{”或“}}”。


*正如@Ben在上面的评论中指出的。(对不起,错过了。)