2016-01-18 6 views
5

मैं अपने कोड में $"hello {person}" और nameof(arg1) जैसी चीजों का उपयोग कर रहा हूं, लेकिन प्रोजेक्ट गुणों की जांच करने पर मैं .NET 4.5 को लक्षित कर रहा हूं।स्ट्रिंग इंटरपोलेशन और नाम का उपयोग। वीएस 2015 नेट 4.5

क्या यह ठीक है? मैंने सोचा कि इन चीजों को 4.6 में पेश किया गया था।

प्रोजेक्ट मेरी मशीन पर ठीक है और चलाता है - लेकिन मुझे चिंता है कि जब मैं इसे तैनात करता हूं तो कुछ गलत हो जाएगा।

+0

जॉन स्कीट द्वारा [संस्करणों को उलझाना] देखें (http://csharpindepth.com/Articles/Chapter1/Versions.aspx)। हालांकि इसमें सी # 6.0 शामिल नहीं है लेकिन अवधारणा एक जैसी है। – Habib

उत्तर

11

यह एक कंपाइलर सुविधा है, ढांचागत सुविधा नहीं। हम सफलतापूर्वक विजुअल स्टूडियो 2015

में हमारे .NET 3.5 परियोजनाओं के साथ दोनों सुविधाओं का उपयोग संक्षेप में, संकलक String.Format("hello {0}", person) को $"hello {person}" और "arg1" को nameof(arg1) अनुवाद करता है। यह सिर्फ वाक्य रचनात्मक चीनी है।

रनटाइम String.Format कॉल (या क्रमशः एक स्ट्रिंग अक्षर "arg1" देखता है) और मूल स्रोत कोड जैसा दिखता है (और न ही देखभाल) जानता है। String.Format .NET Framework के प्रारंभिक दिनों से समर्थित है, इसलिए फ्रेमवर्क के पुराने संस्करण को लक्षित करने से आपको कुछ भी नहीं रोक रहा है।

+1

इस फ़ॉर्म 'फ़ॉर्मटेबल स्ट्रिंग' पर थोड़ी सी झुर्रियों के लिए मेरा जवाब देखें। –

1

इन चीजों को C#6 में पेश किया गया था। .Net के पास इसके साथ कुछ लेना देना नहीं है। इसलिए जब तक आप सी # 6 कंपाइलर का उपयोग कर रहे हैं, तो आप इन सुविधाओं का उपयोग कर सकते हैं।

What is the difference between C# and .NET?

तो हाँ, यह ठीक उन्हें एक परियोजना को लक्षित नेट 4.5 में उपयोग करने के लिए है।

8

मौजूदा उत्तर इस बारे में बात करते हैं कि यह एक .NET फ्रेमवर्क घटक के बिना सी # 6 सुविधा है।

यह nameof का पूरी तरह से सच है - लेकिन केवल कुछ हद तक स्ट्रिंग इंटरपोलेशन के सत्य है।

स्ट्रिंग प्रक्षेप ज्यादातर मामलों में string.Format उपयोग करेगा, लेकिन आप नेट 4.6 उपयोग कर रहे हैं, यह भी एक अंतर्वेशित स्ट्रिंग एक FormattableString है, जो उपयोगी है में बदल सकते हैं अगर आप अपरिवर्तनीय स्वरूपण हैं:

using System; 
using System.Globalization; 
using static System.FormattableString; 

class Test 
{ 
    static void Main() 
    { 
     CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); 
     double d = 0.5; 
     string local = $"{d}"; 
     string invariant = Invariant($"{d}"); 
     Console.WriteLine(local);  // 0,5 
     Console.WriteLine(invariant); // 0.5 
    }  
} 

जाहिर है इस अगर बस string.Format के लिए एक कॉल लागू काम नहीं होगा ... इसके बजाय, इस मामले में यह बयान local को बताए में string.Format कहता है, और बयान invariant को बताए में FormattableStringFactory.Create कहता है, और पर FormattableString.Invariant कॉल परिणाम। यदि आप ढांचे के पहले संस्करण के खिलाफ इसे संकलित करने का प्रयास करते हैं, तो FormattableString मौजूद नहीं होगा, इसलिए यह संकलित नहीं होगा। यदि आप वास्तव में चाहते हैं, तो आप FormattableString और FormattableStringFactory का अपना कार्यान्वयन प्रदान कर सकते हैं, और संकलक उन्हें उचित रूप से उपयोग करेंगे।

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