Что делает {{{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);
как это "ленивый"? Что значит быть ленивым?
полный класс источник:
//----------------------------------------------------------------------------
//
// <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.
4 ответа:
вы побег фигурная скобка с фигурной скобкой, т. е.
{{
производит{
и}}
производит}
.The
{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}
является фактическим полем для замены с первым аргументом, внешний{{
и}}
специальная нотация, чтобы получить один{}