2014-04-16 6 views
73

अभी तक, मैं इस धारणा के तहत था कि Properties & Methods सी # में दो अलग-अलग चीजें हैं। लेकिन फिर मैंने नीचे कुछ ऐसा किया।सी # गुण वास्तव में तरीके हैं?

enter image description here

और यह मेरे लिए एक "आई ओपनर" था। मैं एक संपत्ति stringProp और एक विधि stringProp की अपेक्षा कर रहा था लेकिन इसके बजाय मुझे यह मिला।

ऐसा क्यों हुआ? क्या कोई कृपया समझा सकता है।

+4

यह वास्तव में स्पष्ट नहीं है कि आप एक जवाब के रूप जो खोज रहे हैं। लेकिन [गुण] (http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx) कहता है: "... वे वास्तव में एक्सेसर्स नामक विशेष विधियां हैं।" –

+3

http://en.wikipedia.org/wiki/Syntactic_sugar – ComethTheNerd

+30

एक ही नाम के साथ संपत्ति और विधि रखना कानूनी नहीं है, इसलिए मुझे आश्चर्य नहीं है कि इंटेलिसेंस उलझन में है। –

उत्तर

104

हां, संकलक एक संपत्ति के लिए प्राप्त करने और सेट विधियों की एक जोड़ी उत्पन्न करता है, साथ ही स्वत: कार्यान्वित संपत्ति के लिए एक निजी बैकिंग फ़ील्ड भी उत्पन्न करता है।

private int <Age>k__BackingField; 

public int get_Age() 
{ 
    return <Age>k__BackingField; 
} 

public void set_Age(int age) 
{ 
    <Age>k__BackingField = age; 
} 

कोड है कि आपकी संपत्ति तक पहुँचता है इन दो तरीकों में से एक कॉल करने के लिए संकलित किया जाएगा:

public int Age {get; set;} 

के बराबर हो जाता है। सार्वजनिक क्षेत्र होने के लिए सार्वजनिक क्षेत्र को बदलने का एक कारण यह है कि एक तोड़ने वाला बदलाव है।

जॉन स्कीट के Why Properties Matter देखें।

+10

उत्सुकता से, कोड में '' क्या है? – ca9163d9

+29

@ dc7a9163d9 दरअसल, ' k__BackingField' फ़ील्ड का नाम है। हालांकि यह सी # में एक अवैध नाम है, यह आईएल (इंटरमीडिएट भाषा) में एक बिल्कुल वैध नाम है। यह आईएल उस क्षेत्र को घोषित करने के लिए जेनरेट किया गया है: '.field निजी int32 ' k__BackingField'। अधिकांश कंपाइलर-जेनरेट किए गए प्रकार, जैसे कि लैम्ब्डा क्लोजर और एन्युमरेटर्स में उनके नामों में '<>' होता है। – dcastro

16

यह दृश्य स्टूडियो इंटेलिकेंस मुद्दा है, जो नाम नाम से चुनता है। जिस तरह से आपका कोड संकलित नहीं होगा, उसी प्रकार नाम टकराव के कारण।

लेकिन तुम ठीक कह रहे हैं, कि गुण अंत में तरीके हैं:

public class A { 

    public string Name {get;set;} 
} 
यहाँ

Name संपत्ति 2 तरीकों में बदल जाता है: get_Name() और set_Name()

वास्तव में, अगर आप इस तरह वर्ग को परिभाषित:

public class A { 

    public string Name {get;set;} 

    public string get_Name() { 
     return "aaa"; 
    } 
} 

आप संकलन त्रुटि के रूप में वहाँ है मिल जाएगा, पहले से परिभाषित get_Name (संपत्ति)

24

सच पूछिये तो, गुण नहीं तरीकों, हालांकि वे वास्तव में गेटर और सेटर विधियों (जिन्हें एक्सेसर्स भी कहा जाता है) द्वारा समर्थित है।

ldstr  "bar" 
callvirt foo.set_stringProp 

कहाँ set_stringProp के लिए सेटर विधि है: जब आप इस तरह कोड लिखने

myFoo.stringProp = "bar"; 

संकलक वास्तव में इस तरह आईएल कोड उत्पन्न करता है (बशर्ते आप संकलन नीचे वर्णित त्रुटि दूर करने के लिए कोड को संशोधित) वह संपत्ति वास्तव में, यदि आप बहुत वांछित हैं, तो आप प्रतिबिंब के माध्यम से सीधे इन तरीकों का आह्वान कर सकते हैं।

हालांकि, आपके द्वारा पोस्ट किया गया कोड नमूना विजुअल स्टूडियो के इंटेलिजेंस में ठीक दिख सकता है, लेकिन यह संकलित नहीं होगा।परियोजना के निर्माण की कोशिश करो और आप की तरह एक त्रुटि देखेंगे:

प्रकार 'foo' पहले से ही के लिए एक परिभाषा में शामिल है 'stringProp'

+2

सबसे बड़ा अंतर यह है कि संपत्तियों के गुणों के माध्यम से अतिरिक्त संबंधित मेटाडेटा हो सकता है जो विधियों पर लागू नहीं हो सकता है। –

-1

हां। गुण mutator विधियां हैं।

कंप्यूटर विज्ञान में, एक म्यूटेटर विधि एक चर है जो एक चर में परिवर्तनों को नियंत्रित करने के लिए उपयोग की जाती है। वे भी सेटटर विधियों के रूप में व्यापक रूप से जाना जाता है। अक्सर एक सेटर के साथ एक गेटर (जिसे एक एक्सेसर भी कहा जाता है) के साथ होता है, जो निजी सदस्य चर का मूल्य देता है।

उत्परिवर्तन के सिद्धांत को ध्यान में रखते हुए म्यूटेटर विधि ऑब्जेक्ट उन्मुख प्रोग्रामिंग में अक्सर उपयोग किया जाता है। इस सिद्धांत के अनुसार, किसी वर्ग के सदस्य चर को अन्य कोड से छिपाने और उनकी रक्षा करने के लिए निजी बनाया जाता है, और केवल सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है।

गैर-ऑब्जेक्ट उन्मुख वातावरण में म्यूटेटर विधियों का भी उपयोग किया जा सकता है। इस मामले में, संशोधित करने के लिए चर के संदर्भ को नए मान के साथ म्यूटेटर को पास किया जाता है। इस परिदृश्य में, संकलक म्यूटेटर विधि को बाईपास करने और सीधे चर को बदलने से कोड को प्रतिबंधित नहीं कर सकता है। ऑनस डेवलपर्स को यह सुनिश्चित करने के लिए गिरता है कि वेरिएबल केवल म्यूटेटर विधि के माध्यम से संशोधित किया गया है और सीधे संशोधित नहीं किया गया है।

प्रोग्रामिंग भाषाओं में उन्हें समर्थन देने वाली भाषाओं में, गुण encapsulation की उपयोगिता को छोड़ दिए बिना एक सुविधाजनक विकल्प प्रदान करते हैं।

संदर्भ: http://en.wikipedia.org/wiki/Mutator_method

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