C # 6 में, आप nameof()
एक चर या एक प्रकार के नाम से युक्त स्ट्रिंग प्राप्त करने के लिए ऑपरेटर का उपयोग कर सकते हैं ।
यह संकलन-समय पर मूल्यांकन किया जाता है, या कुछ रोसलिन एपीआई के माध्यम से रनटाइम पर?
C # 6 में, आप nameof()
एक चर या एक प्रकार के नाम से युक्त स्ट्रिंग प्राप्त करने के लिए ऑपरेटर का उपयोग कर सकते हैं ।
यह संकलन-समय पर मूल्यांकन किया जाता है, या कुछ रोसलिन एपीआई के माध्यम से रनटाइम पर?
जवाबों:
हाँ। nameof()
संकलन-समय पर मूल्यांकन किया जाता है। चश्मा के नवीनतम संस्करण को देखते हुए:
नेमोफ अभिव्यक्ति एक स्थिर है। सभी मामलों में, एक स्ट्रिंग का उत्पादन करने के लिए नामोफ़ (...) का संकलन-समय पर मूल्यांकन किया जाता है । इसके तर्क का मूल्यांकन रनटाइम पर नहीं किया जाता है, और इसे अगम्य कोड माना जाता है (हालांकि यह "अगम्य कोड" चेतावनी का उत्सर्जन नहीं करता है)।
आप इस TryRoslyn उदाहरण के साथ देख सकते हैं जहां यह:
public class Foo
{
public void Bar()
{
Console.WriteLine(nameof(Foo));
}
}
इसमें संकलित और विघटित किया गया है:
public class Foo
{
public void Bar()
{
Console.WriteLine("Foo");
}
}
इसका रन-टाइम समतुल्य है:
public class Foo
{
public void Bar()
{
Console.WriteLine(typeof(Foo).Name);
}
}
जैसा कि टिप्पणियों में उल्लेख किया गया था, इसका मतलब है कि जब आप nameof
सामान्य प्रकार में पैरामीटर का उपयोग करते हैं, तो केवल टाइप पैरामीटर्स के नाम के बजाय वास्तविक डायनामिक प्रकार का नाम टाइप पैरामीटर के रूप में उपयोग करने की अपेक्षा न करें। तो यह:
public class Foo
{
public void Bar<T>()
{
Console.WriteLine(nameof(T));
}
}
public class Foo
{
public void Bar<T>()
{
Console.WriteLine("T");
}
}
मैं @ I3arnon द्वारा प्रदान किए गए उत्तर को एक प्रमाण के साथ समृद्ध करना चाहता था कि इसका संकलन-समय पर मूल्यांकन किया जाता है।
चलो मान लेते हैं कि मैं nameof
ऑपरेटर का उपयोग करके कंसोल में एक चर का नाम प्रिंट करना चाहता हूं :
var firstname = "Gigi";
var varname = nameof(firstname);
Console.WriteLine(varname); // Prints "firstname" to the console
जब आप एमएसआईएल उत्पन्न की जाँच करते हैं, तो आप देखेंगे कि यह एक स्ट्रिंग घोषणा के बराबर है क्योंकि एक स्ट्रिंग के लिए एक ऑब्जेक्ट संदर्भ ldstr
ऑपरेटर का उपयोग करके स्टैक को धकेल दिया जाता है :
IL_0001: ldstr "Gigi"
IL_0006: stloc.0
IL_0007: ldstr "firstname"
IL_000c: stloc.1
IL_000d: ldloc.1
IL_000e: call void [mscorlib]System.Console::WriteLine(string)
आप देखेंगे कि फर्स्टनाम स्ट्रिंग घोषित करना और nameof
ऑपरेटर का उपयोग करना MSIL में एक ही कोड उत्पन्न करता है, जिसका अर्थ nameof
है कि स्ट्रिंग वेरिएबल घोषित करने में उतना ही कुशल है।
nameof
ऑपरेटर है, न कि एक सादा हार्डकोडेड स्ट्रिंग?