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}