2011-03-17 167 views
9

我经常看到花括号中字符串通常包含一个数字,如:大括号{0}

string something = "I have {0} cats"; 

虽然我可以算出来这是什么意思,我可以说我从来没有读过任何与其用途有关的文件。 C#字符串文档似乎没有任何有关这些信息。任何人都可以将我指向正确的方向吗?

+2

值得注意的是,随着[Interpolated Strings](https://msdn.microsoft.com/en-us/library/dn961160.aspx)的引入,花括号可能会在字符串中出现更多 - 在字符串的开头注意$。 [这是一个很好的解释](http://stackoverflow.com/a/32879070/340045)。 – Ben 2016-03-30 10:49:18

回答

19

用于string.Format作为值参数的占位符。 string.Format(“我有{0}猫”,5);打印“我有5只猫”

所以你可以使用string.Format(东西,5);并得到同样的结果如上

3

它几乎可以肯定,后来在String.Format电话,其中编号的占位符被附加参数替代使用:

string something = "I have {0} cats"; 
int myNumCats = 2 
var theResult = String.Format(something,myNumCats); 
10

这是String.Format使用的正常格式字符串,被称为“复合格式”。欲了解更多信息,看看here

+0

首先回答正确的名称和链接 – 2011-03-17 17:04:00

2

*与C#6.0 &朋友,花括号不仅仅是string.Format!现在,它们可以表示为interpolated strings,您可以在其中混合使用C#对象和代码,而不需要所有的开销。

注:插值字符串美元符号开始:$

the language reference page linked above

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

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

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

包含两个插值表达式, '{名称}' 和 '{小时:HH}'。该 相当于复合格式字符串是:

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

注:如果你不知道,Console.WriteLine有一种内置string.Format,这可能不是在上面的例子,如果明显你没有意识到要去英寸

如果你想获得相同的串出,而不依赖于Console.WriteLine魔力,它可能是更容易阅读,这...

string message = $"Name = {name}, hours = {hours:hh}"; // interpolated 

...相当于...

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

内插字符串的结构是:

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

  • 场宽度是一个有符号的整数,用于指示字符的数量在该领域的专家。如果是肯定的,该字段是右对齐的;如果是负数,则为左对齐。
  • 格式字符串是适用于被格式化对象类型的格式字符串。例如,对于DateTime值,它可能是标准的日期和时间格式字符串,如“D”或“d”。

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

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


*由于@Ben points out in a comment, above。 (对不起,在路上错过了。)