2016-09-10 15 views
5

मैं बस सोच रहा था कि सी # 6 से नाम कैसे आते हैं, गैर स्थैतिक संपत्ति तक पहुंच सकते हैं जैसे कि यह स्थैतिक था। यहाँ एक उदाहरणनाम का नाम कैसे काम करता है?

public class TestClass 
{ 
    public string Name { get; set; } 
} 

public class Test 
{ 
    public Test() 
    { 
     string name = nameof(TestClass.Name); // whats so speciall about nameof 
     //string name2 = TestClass.Name; this won't compile obviously, 
    } 
} 
+6

में और अधिक हो सकता है! के लिए क्रम प्रयोजनों typeOf या बजाय .GetType() का उपयोग करें।

पढ़ें इसके बारे में कुछ खास नहीं है। यह संकलन समय पर होता है, रनटाइम पर नहीं। और कंपाइलर को किसी नाम के सदस्य को स्ट्रिंग अक्षर "नाम" में परिवर्तित करने के लिए कोई समस्या नहीं है। केवल एक चीज जो इसके बारे में अजीब बात है, इसने भाषा में जोड़े जाने के लिए 6 संस्करण क्यों लिया :) –

+0

आपका क्या मतलब है "नाम का नाम कैसे काम करता है?" क्यों _wouldn't_ यह काम नहीं करता? क्या आपके पास एक ही तरह का प्रश्न है, उदाहरण के लिए 'के लिए', 'स्विच', 'वापसी', आदि? उन कामों में से _any_ कैसे करते हैं? संकलक उन्हें समझने के लिए लिखा गया है और जब यह उन्हें देखता है तो सही संकलित कोड उत्पन्न करता है। क्या आप एक स्पष्टीकरण की तलाश कर रहे हैं कि कंपेलर कैसे काम करते हैं? फिर, "बहुत व्यापक"। यदि नहीं, तो मैं वास्तव में नहीं समझता कि आप क्या पूछ रहे हैं। कृपया बताएं कि वास्तव में आपको क्या परेशान कर रहा है। –

+0

आपको यहां अपना उत्तर मिल सकता है: http://stackoverflow.com/questions/31695900/what-is-the-purpose-of-nameof –

उत्तर

8

यह संपत्ति नहीं "तक पहुंच" है - कि ऑपरेटर विशुद्ध रूप से कोड में तर्क के "नाम" इंजेक्षन करने के लिए एक संकलक तंत्र है। इस मामले में यह "Name" के साथ nameof(TestClass.Name) को प्रतिस्थापित करेगा। तथ्य यह है कि यह गैर स्थैतिक है अप्रासंगिक है।

+5

"यह' testClass.Name "' 'testClass.Name 'के साथ' nameof (TestClass.Name)' को प्रतिस्थापित करेगा। "नहीं, यह इसे '' नाम '' के साथ बदल देगा। – svick

+3

इसके अलावा, 'nameof' निजी सदस्यों तक नहीं पहुंच सकता है, आपका कोड ठीक काम नहीं करता है, यह विफल रहता है: "CS0122' AY 'इसके सुरक्षा स्तर के कारण पहुंच योग्य नहीं है" – svick

+0

वैसे यह काम करता है [http] // http: // ideone .com/GG9VcU) लेकिन मैंने उस भाग को बाहर निकाला क्योंकि यह प्रश्न के लिए प्रासंगिक नहीं है। –

3

nameof इंटरप्रेटर compiletime पर हल हो जाता है और इसके बजाय static string पर अनुवाद किया जाता है।
आपके मामले में nameof(TestClass.Name) आप केवल स्ट्रिंग के रूप में "Name" वापस कर देंगे।
आपको nameof(TestClass) का उपयोग करना होगा।
nameof के साथ आप अपने कोड में अतिरेक को कम कर सकते हैं (उदाहरण के लिए:। आप न nameof का उपयोग करके एक प्रॉपर्टी या कुछ इस तरह के लिए एक स्ट्रिंग को परिभाषित करने के लिए है

आप इसका उपयोग एक कक्षाएं नाम का प्रतिनिधित्व कर सकते हैं लेकिन हो सकता है। ध्यान रखें! nameof(MyClass)
नहीं कार्यावधि में के रूप में ही अगर आप एक व्युत्पन्न वर्ग है MSDN

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