string.Format上的{{{0}}是做什么的?

在命名空间MS.Internal ,有一个名为NamedObject的类。

它有一个奇怪的代码块:

 public override string ToString() { if (_name[0] != '{') { // lazily add {} around the name, to avoid allocating a string // until it's actually needed _name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", _name); } return _name; } 

我很好奇这个评论:

  // lazily add {} around the name, to avoid allocating a string // until it's actually needed _name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", _name); 

那“懒惰”怎么样? 它做什么懒惰?


参考资料来源全class:

 //---------------------------------------------------------------------------- // // <copyright file="NamedObject.cs" company="Microsoft"> // Copyright (C) Microsoft Corporation. All rights reserved. // </copyright> // // Description: Placeholder object, with a name that appears in the debugger // //--------------------------------------------------------------------------- using System; using System.Globalization; using MS.Internal.WindowsBase; namespace MS.Internal { /// <summary> /// An instance of this class can be used wherever you might otherwise use /// "new Object()". The name will show up in the debugger, instead of /// merely "{object}" /// </summary> [FriendAccessAllowed] // Built into Base, also used by Framework. internal class NamedObject { public NamedObject(string name) { if (String.IsNullOrEmpty(name)) throw new ArgumentNullException(name); _name = name; } public override string ToString() { if (_name[0] != '{') { // lazily add {} around the name, to avoid allocating a string // until it's actually needed _name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", _name); } return _name; } string _name; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. 

你用一个大括号逃过一个大括号,例如 {{产生{ ,和}}产生}

中间的{0}像往常一样被解释 – 也就是在索引0处对参数的引用。

 {{ {0} }} ^^ ^^^ ^^ | | | | | +--- Closing curly brace | +------ Parameter reference +---------- Opening curly brace 

最终的结果是用大括号括起来的参数零的值:

 var res = string.Format("{{{0}}}", "hello"); // produces {hello} 

那“懒惰”怎么样?

他们称这个替代“渴望”的执行方式为懒惰:

 internal class NamedObject { public NamedObject(string name) { if (String.IsNullOrEmpty(name)) throw new ArgumentNullException(name); if (name[0] != '{') { // eagerly add {} around the name _name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", name); } else { _name = name; } } public override string ToString() { return _name; } string _name; } 

这个实现会立即添加花括号,即使它不知道花括号中的名字是需要的。

那“懒惰”怎么样? 它做什么懒惰?

懒惰来自于它之前的if (_name[0] != '{')

它仅在第一次请求时才更改_name字段。

和大家已经指出的一样, String.Format("{{{0}}}", _name); 应被解读为"{{ {0} }}""\{ {0} \}" 。 内部{0}是用第一个参数replace的实际字段,外部{{}}是一个特殊的符号来获得单个{}

{{}}只是给你文字{} 。 (逃离的大括号)

所以,如果你有{{{0}}} ,你放弃foo ,输出将是{foo}

 var value = "value"; String.Format(CultureInfo.InvariantCulture, "{{{0}}}", value); // will output {value}