字符串中的花括号 {0}

13

我经常看到一个字符串中包含花括号,通常里面包含一个数字,比如:

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

虽然我可以理解这是什么意思,但我从未阅读过与其使用相关的任何文档。C#字符串文档似乎没有任何关于这些内容的信息。有人能指点我一下吗?


2
值得注意的是,随着插值字符串的引入,花括号可能会在字符串中出现得更频繁 - 注意字符串开头的$符号。这里有一个很好的解释 - Ben
6个回答

21

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

因此,您可以使用 string.Format(something, 5); 并获得与上面相同的结果。


13

这是由 String.Format 使用的常规格式字符串,被称为“复合格式化”。有关更多信息,请查看此处


10
*随着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

...等同于...

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

一个插值字符串的结构如下: $"<text> {<interpolated-expression> [,<field-width>] [<:format-string>] } <text> ..."
其中:
  • field-width 是一个带符号整数,表示字段中字符的数量。如果是正数,则字段右对齐;如果为负数,则左对齐。
  • format-string 是适用于正在格式化的对象类型的格式字符串。例如,对于 DateTime 值,它可以是标准日期和时间格式字符串,如 "D" 或 "d"。
您可以在任何可以使用字符串字面量的地方使用插值字符串。每次执行具有插值字符串的代码时,都会评估插值字符串。这样,您就可以将插值字符串的定义和评估分开。 要在插值字符串中包含花括号(“{”或“}”),请使用两个花括号,“{{”或“}}”。

* 正如@Ben在评论中指出的那样。(抱歉,我在输入时错过了这一点。)


3

它几乎肯定会在String.Format调用中使用,其中编号的占位符将被附加参数替换:

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接