2016-07-18 29 views
54

नामस्थान MS.Internal में, NamedObject नाम की एक कक्षा है।string.Format पर {{{0}}} क्या करता है?

यह कोड का एक अजीब ब्लॉक है:

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); 

कि 'आलसी' कैसी है? आलसी होने के लिए यह क्या करता है?


reference source से पूर्ण वर्ग:

//---------------------------------------------------------------------------- 
// 
// <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

यह केवल एक बार नाम_ को प्रदान करती है प्राप्त करने के लिए एक विशेष अंकन कर रहे हैं अगर इसके पहले नहीं किया तो –

+6

यह आलसी के रूप में माना जाता है क्योंकि घुंघराले-ब्रैकेट वाली स्ट्रिंग को 'ToString() 'पर पहली कॉल तक उत्पन्न नहीं किया जाता है। आप * आलसी * के रूप में * मांग पर * पढ़ सकते हैं। –

+1

@ FrédéricHamidi ओह, यह एक चुस्त छोटी हैक – Mafii

उत्तर

64

आप escape a curly brace with a curly brace, अर्थात {{{ पैदा करता है, और }}} पैदा करता है।

मध्य में {0} सामान्य रूप से व्याख्या किया जाता है - यानी सूचकांक शून्य पर पैरामीटर का संदर्भ।

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

कि 'आलसी' कैसे है:

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

अंतिम परिणाम घुंघराले ब्रेसिज़ में संलग्न पैरामीटर शून्य का मूल्य है?

वे इस विकल्प के संबंध में आलसी यह कॉल "उत्सुक" कार्यान्वयन:

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; 
} 

इस कार्यान्वयन घुंघराले ब्रेसिज़ कहते हैं सही दूर है, भले ही यह पता नहीं है कि नाम घुंघराले ब्रेसिज़ में संलग्न रहा है है जरूरी है

+0

तो स्ट्रिंग को तब तक प्रारंभ नहीं किया जा रहा है जब तक कि यह सही नहीं है क्योंकि संकलक को पता नहीं चलता कि यह दौड़ जाएगा या नहीं? (यह कंपाइलर चाल करता है?) – Mafii

+0

@ माफि मैंने स्पष्टीकरण को "गैर आलसी" विकल्प के साथ बदल दिया। ऐसा लगता है कि जब कोई 'ToString' को कॉल करने की योजना नहीं बना रहा है तो वे' नामांकित ऑब्जेक्ट 'उदाहरण बनाने के प्रभाव को कम करना चाहते हैं। – dasblinkenlight

+0

ओह, यह अच्छा है। समझने में आसान, बहुत अच्छी व्याख्या। मैंने इसके बारे में भी सोचा नहीं था। बहुत बुरा है कि वे ऐसा करते हैं (इसकी केवल एक स्ट्रिंग पर विचार करते हैं) – Mafii

10

{{ और }} बस आपको शाब्दिक { और } दें। (बच घुंघराले ब्रेसिज़)

इसलिए, अगर आप {{{0}}} है, और आप foo साथ देते हैं, उत्पादन {foo}

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

मैं ओपी द्वारा पोस्ट किए गए कोड में कोई अंतर नहीं देख सकता। अगर वह इसे चलाने के लिए चाहते हैं, तो वह इसे आसानी से चला सकता है। –

15

हो जाएगा कैसे है कि 'आलसी' है? आलसी होने के लिए यह क्या करता है?

आलसी if (_name[0] != '{') से पहले आती है।

यह पहली बार अनुरोध किए जाने पर _name फ़ील्ड को बदलता है।

और जैसा कि पहले से ही इंगित किया गया है, String.Format("{{{0}}}", _name);"{{ {0} }}" या "\{ {0} \}" के रूप में पढ़ा जाना चाहिए।भीतरी {0} पहला तर्क के साथ स्थानापन्न करने वास्तविक क्षेत्र, बाहरी है {{ और }} एकल {}

संबंधित मुद्दे