2011-02-18 23 views
30

मैंने अभी कई Property Set विधियों का निर्माण किया है, और वे संकलित नहीं हुए हैं। जब मैंने उन्हें Property Let में बदल दिया, तो सबकुछ ठीक था।वीबी 6 में संपत्ति सेट और संपत्ति के बीच क्या अंतर है?

मैंने Property Set और Property Let के बीच अंतर खोजने के लिए प्रलेखन का अध्ययन किया है, लेकिन किसी को भी बुद्धिमान होने के लिए स्वीकार नहीं करना चाहिए। क्या कोई अंतर है, और यदि ऐसा है तो कोई व्यक्ति उचित स्पष्टीकरण के लिए सूचक की पेशकश कर सकता है?

उत्तर

22

Property Set वस्तुओं (जैसे, वर्ग उदाहरण)

Property Let "सामान्य" डेटाटाइप्स के लिए है (उदाहरण के लिए, स्ट्रिंग, बूलियन, लम्बा, इत्यादि)

+0

यह WithEvents से असंबंधित है, यह गुणों के रूप में ऑब्जेक्ट संदर्भों को वापस करने के लिए है। कई बार ऐसा करना होता है जब आप ऐसा करना चाहते हैं, अक्सर जब आपके पास किसी प्रकार का ऑब्जेक्ट पदानुक्रम होता है। – Bob77

+0

गलत। संपत्ति प्रॉपर्टी को गुणों के रूप में वापस करने के लिए 'प्रॉपर्टी गेट' का उपयोग किया जाता है, न कि 'संपत्ति सेट'। – mwolfe02

+0

http://msdn.microsoft.com/en-us/library/aa266202(VS.60).aspx: 'फ़ंक्शन' और 'प्रॉपर्टी गेट' प्रक्रिया की तरह, एक 'प्रॉपर्टी सेट' प्रक्रिया एक अलग प्रक्रिया है जो कर सकती है तर्क लें, बयानों की एक श्रृंखला करें, और इसके तर्कों के मूल्य को बदलें। ** हालांकि, 'फंक्शन' और 'प्रॉपर्टी गेट' प्रक्रिया के विपरीत, दोनों एक मूल्य लौटाते हैं, आप ऑब्जेक्ट रेफरेंस असाइनमेंट ('सेट' कथन) के बाईं ओर केवल 'प्रॉपर्टी सेट' प्रक्रिया का उपयोग कर सकते हैं।** – mwolfe02

3

Property Set वस्तु की तरह चर (ByRef) जबकि Property Let के लिए है मूल्य की तरह चर के लिए है (ByVal)

+2

यह बायरफ बनाम ByVal मुद्दा नहीं है, लेकिन कॉलर को ऑब्जेक्ट संदर्भों को वापस करने के लिए सख्ती से उपयोग किया जाता है। – Bob77

+0

यह सच है कि यह एक ByRef/ByVal मुद्दा नहीं है। लेकिन यह ** ** ** कॉलर को ऑब्जेक्ट संदर्भों को वापस करने के लिए उपयोग नहीं किया गया है। इसके लिए आप 'प्रॉपर्टी गेट' का उपयोग उसी तरह करते हैं जैसे आप किसी अन्य क्लास प्रॉपर्टी को वापस करने के लिए करेंगे (वर्ग गुणों को वापस करने के लिए कोई ऑब्जेक्ट-विशिष्ट संस्करण नहीं है)। – mwolfe02

+0

हां, मेरे पास बिल्कुल पीछे की तरफ था, यह किसी ऑब्जेक्ट प्रॉपर्टी को असाइन करने के लिए है - डुह, वास्तव में बहुत बुरा गुम है। – Bob77

22

Property LetProperty Set से अधिक बहुमुखी है। उत्तरार्द्ध केवल संदर्भ संदर्भों तक ही सीमित है। यदि आप एक कक्षा में इस संपत्ति है, तो

Private m_oPicture   As StdPicture 

Property Get Picture() As StdPicture 
    Set Picture = m_oPicture 
End Property 

Property Set Picture(oValue As StdPicture) 
    Set m_oPicture = oValue 
End Property 

Property Let Picture(oValue As StdPicture) 
    Set m_oPicture = oValue 
End Property 

आप

Set oObj.Picture = Me.Picture 

साथ Property Set Picture कॉल कर सकते हैं आप दोनों

Let oObj.Picture = Me.Picture 
oObj.Picture = Me.Picture 

को लागू करने Property Set साथ Property Let Picture कॉल कर सकते हैं क्या अन्य डेवलपर्स संपत्तियों के लिए उम्मीद है कि ऑब्जेक्ट संदर्भ हैं लेकिन कभी-कभी माइक्रोसॉफ्ट संदर्भ गुणों के लिए केवल Property Let प्रदान करता है, जिससे यूयू Set कथन के बिना सील सिंटैक्स oObj.Object = MyObject। इस मामले में Set कथन का उपयोग संकलन-समय या रन-टाइम त्रुटि की ओर जाता है क्योंकि oObj कक्षा पर लागू नहीं किया गया है।

मैं मानक प्रकारों - फोंट, चित्र इत्यादि के गुणों के लिए Property Set और Property Let दोनों को लागू करता हूं - लेकिन विभिन्न अर्थशास्त्र के साथ। आमतौर पर Property Let पर मैं "गहरी प्रति" निष्पादित करता हूं, यानी मूल ऑब्जेक्ट का संदर्भ रखने के बजाय StdFont क्लोनिंग करता हूं।

+0

मान लीजिए कि आपके पास ऑब्जेक्ट प्रकार के लिए 'प्रॉपर्टी सेट' और 'प्रॉपर्टी लेट' दोनों हैं, और यह मानते हुए कि कार्यान्वयन कोड समान है (जैसे कि आपके उदाहरण में), क्या वीबी 6 में वास्तव में क्या होगा, इसमें कोई अंतर्निहित अंतर है डेवलपर या तो संपत्ति कहता है? उदाहरण के लिए, क्या वीबी 6 निश्चित रूप से संदर्भ के बजाए ऑब्जेक्ट को मूल्य से पास करने का निर्णय लेगा, अगर डेवलपर 'लेट' संपत्ति कहता है, या ऐसे कोई अन्य छोटी बारीकियां हैं? (मुझे पता है कि आपने कहा है कि जिन्हें आप लिखना पसंद करते हैं, उनमें अलग-अलग अर्थशास्त्र होते हैं, लेकिन मुझे यकीन नहीं है कि भाषा अपने आप से कुछ अलग करती है।) – Panzercrisis

+0

वीबी 6 में पैराम के लिए "मूल्य से ऑब्जेक्ट पास करें" विकल्प नहीं है। 'ByVal oValue के रूप में StdPicture 'बनाम' ByRef oValue के रूप में StdPicture 'ऑब्जेक्ट * संदर्भ * पारित करने के तरीके को बदलता है। यह 'StdPicture * oValue' बनाम' StdPicture ** oValue' सी/सी ++ में है - हमेशा पॉइंटर्स लेकिन दूसरे मामले में किसी के पास प्रक्रिया के अंदर * संदर्भ * (जैसे किसी नए ऑब्जेक्ट को रेफरी असाइन करना) बदलने की क्षमता होती है और कॉलर इस नए संदर्भ प्राप्त कर सकते हैं। तो प्रति से कोई "प्रतिलिपि" विकल्प नहीं है और मैं आम तौर पर 'गहरी प्रति" अर्थशास्त्र को लागू करने के लिए 'प्रॉपर्टी लेट' के अंदर 'क्लोन' विधि (उदा। 'आईफॉन्ट' इंटरफ़ेस पर) का उपयोग कर रहा हूं। – wqw

+0

संदर्भ प्रकारों के लिए, मेरा मतलब है मूल्य से संदर्भ पास करना, जैसे VB.NET/C# में। – Panzercrisis