2012-03-15 13 views
7

मैं सी # दुनिया से वीबीएनईटी में आ रहा हूं और यह पहेली मुझे। एक ही काम करने के 2 तरीके क्यों हैं? या क्या कोई अंतर है जिसके बारे में मुझे पता नहीं है?vb.net में पैरामीटरयुक्त संपत्ति और फ़ंक्शन के बीच क्या अंतर है?

निम्नलिखित में क्या अंतर है:

Public ReadOnly Property Test(ByVal v as String) As Integer 
    Get 
    Return SomeOperationOn(v) 
    End Get 
End Property 

और

Public Function Test(ByVal v as String) As Integer 
    Return SomeOperationOn(v) 
End Function 

जब आप एक प्रयोग करते हैं के रूप में अन्य के लिए विरोध किया?

उत्तर

10

कार्यात्मक रूप से कोई अंतर नहीं है, वे दोनों पैरामीटर के आधार पर एक मान वापस करते हैं। वास्तव में, गुण वास्तव में संकलन के दौरान कार्यों में परिवर्तित हो जाते हैं, क्योंकि संपत्ति की धारणा MSIL में मौजूद नहीं है।

शब्दार्थ, तथापि, वहाँ कैसे वे इस्तेमाल किया जाना चाहिए में एक फर्क है। गुण किसी ऑब्जेक्ट की आंतरिक स्थिति का पर्दाफाश करने के तरीके के रूप में हैं। दूसरी ओर, कार्यों को किसी ऑब्जेक्ट के राज्य पर संचालित करने के लिए या तो एक विशिष्ट प्रश्न (क्वेरी) का उत्तर प्रदान करने या किसी भी तरह से राज्य को संशोधित करने के लिए (कमांड) को उत्तर देने के लिए माना जाता है।

यहाँ एक उदाहरण है:

Public Class Rectangle 
    Private _size As Size 

    ReadOnly Property Size() As Size 
     Get 
      Return _size 
     End Get 
    End Property 

    Public Function IsSquare() As Boolean 
     Return _size.Width = _size.Height 
    End Function 
End Class 

जबकि Size बस वस्तु का एक संपत्ति को उजागर करता है, IsSquare समारोह वास्तव में आदेश में एक सवाल का जवाब देने में वस्तु की आंतरिक स्थिति पर एक आपरेशन प्रदर्शन करती है।

इस सिद्धांत के आधार पर, VB.NET में पैरामिट्रीकृत संपत्तियों के लिए सबसे अधिक आम उपयोग कक्षाएं कि आइटम, जहां प्राचल अपनी स्थिति या द्वारा अनुक्रम में एक विशिष्ट तत्व का उपयोग करने के लिए किया जाता है का एक अनुक्रम प्रतिनिधित्व में है कुछ अद्वितीय कुंजी द्वारा। दूसरे शब्दों में, सी # में indexers के रूप में जाना जाने वाला बनाने के लिए।

5

संपत्ति भी एक सेटर हो सकता है:

Public Property Test(ByVal v as String) As Integer 
    Get 
     Return SomeDictionary(v) 
    End Get 
    Set 
     SomeDictionary(v) = Value 
    End Set 
End Property 

यह एक फर्क नहीं पड़ता, क्योंकि यह आपको कुछ इस तरह लिखने के लिए अनुमति देता है:

MyObject.Test(index) = SomeValue 

सी # केवल आपको लगता है कि के माध्यम से की तरह आवंटित करने के लिए अनुमति देता है संपत्ति सूचकांक:

MyOjbect[index] = SomeValue; 

इसका अर्थ है सी # में आपके पास केवल एक अनुक्रमित संपत्ति हो सकती है प्रकार। VB.Net एक प्रकार से एक से अधिक अनुक्रमित संपत्ति की अनुमति देता है। समकक्ष वाक्यविन्यास प्राप्त करने के लिए, सी # को केवल अंतर्निहित शब्दकोश का खुलासा करना होगा या यदि आपके पास गेटर/सेटर (जैसे लॉगिंग) में कोई अन्य कोड है तो आपको अपने शब्दकोश को लपेटने के लिए एक अतिरिक्त प्रकार बनाना होगा।

+0

मायोज़बीक्ट [इंडेक्स] = कुछ वैल्यू; आप इसे vb.net – MarcelDevG

+0

में डिफ़ॉल्ट संपत्ति के माध्यम से कर सकते हैं हां, आप कर सकते हैं। क्या आप केवल एक डिफ़ॉल्ट संपत्ति हो सकते हैं। यह आपको एक ही प्रकार पर एकाधिक शब्दकोश-जैसी गुणों की सुविधा देता है। –

+0

अर्थशास्त्र, लेकिन आपके पास 'ReadOnly' संपत्ति में एक सेटटर नहीं हो सकता है। –

10

इस प्रश्न के पीछे बहुत सारे इतिहास हैं, यह 1 99 7 में वापस चला गया जब माइक्रोसॉफ्ट ने COM ऑटोमेशन विनिर्देश जारी किया। जिसने संपत्ति सेटर्स/गेटर्स को तर्क देने की अनुमति दी।विजुअल बेसिक स्पेक का प्रारंभिक गोद लेने वाला था, इसे वीबीएक्स एक्सटेंशन मॉडल के प्रतिस्थापन खोजने के लिए भाषा द्वारा किसी भी छोटे हिस्से में संचालित नहीं किया गया था। जो उस समय गैस से बाहर भाग गया, यह 16-बिट कोडिंग मॉडल पर काफी निर्भर था।

सी # टीम ने इस सुविधा के लिए एक सुंदर बकवास रवैया लिया, वे वाक्यविन्यास अस्पष्टता से नफरत करते हैं। यह सिर्फ एक नई नई भाषा में नहीं है। वीबी.नेट में वही विलासिता नहीं थी, उस समय उन्हें पिछली पीढ़ी, वीबी 6 की कुछ विशेषताओं का समर्थन करना था।

10 साल आगे ज़िप, सी # टीम को लोकप्रिय मांग से थोड़ा पीछे हटना पड़ा। इंडेक्स किए गए गुण राइफ में हैं, उदाहरण के लिए, ऑफिस ऑब्जेक्ट मॉडल। सी # संस्करण 4 में उन्होंने सी # कार्यालय कोड लिखने के दर्द को नरम करने के लिए विशेष रूप से COM इंटरफेस के लिए अनुक्रमित गुणों की अनुमति दी। और अधिक, वैकल्पिक और नामित तर्क टाइप के साथ निपटने के लिए भी जोड़े गए हैं। गुमशुदा दुख। और गतिशील कीवर्ड देर से बाध्यकारी का समर्थन करने के लिए, COM और Visual Basic की एक और महत्वपूर्ण विशेषता है जो वास्तव में उस कीवर्ड के बिना सी # में दर्दनाक है।

लंबी कहानी छोटी, COM सुंदर है, I अज्ञात का लालित्य स्थिर है। टोनी विलियम्स इसके पीछे प्रतिभा है। वीडियो is here, देखने लायक है। COM ऑटोमेशन, आईडीस्पैच का सबसेट इतना सुंदर नहीं है। लेकिन यह अविश्वसनीय रूप से सफल था। भाषाएं इसे अपने संकट पर नजरअंदाज करती हैं। सी # नहीं था।

ये विवरण लंबे समय से एक युग से आर्केन लग सकते हैं लेकिन वे नहीं हैं। विंडोज एपीआई का अगला संस्करण, विनआरटी पूरी तरह से अज्ञात पर आधारित है। अन्यथा "मेट्रो" या "आधुनिक यूआई" के रूप में जाना जाता है। आईडीस्पेच जीवित नहीं रहा, IInspectable द्वारा प्रतिस्थापित किया गया।

+0

सी # में, यह वाक्यविन्यास संदिग्ध नहीं होगा क्योंकि एक सरणी अनुक्रमणिका सी # में विधि कॉल की तरह नहीं दिखती है जैसे यह वीबी में होती है। –

+0

@ जोएल - कितने इंडेक्स? एक से अधिक सामान्य लटकाना है। वर्कशीट। कैल्स [एक्स, वाई] सी # संस्करण 4 में समर्थित है, प्रोग्रामर पर एक बुरा चाल है जो मार्शल को कॉल करना भी पसंद करता है। ReleaseComObject()। वहां एक आईरेंज इंटरफ़ेस संदर्भ है जो अदृश्य है। –

+0

मेरी इच्छा है कि भाषा डिजाइनर "संदिग्ध" संरचनाओं को स्वीकार करने के इच्छुक हों जिन्हें लालची बाध्यकारी के साथ स्पष्ट किया जा सके। यदि 'टेस्ट [int] '' Foo' वर्ग की एक अनुक्रमित संपत्ति है और' टेस्ट' एक सामान्य संपत्ति है, 'Foo.Text [3] '' Foo' की अनुक्रमित' टेस्ट' संपत्ति का उपयोग करेगा, जबकि ' (Foo.Text) [3] 'गैर अनुक्रमित संपत्ति' टेस्ट' का उपयोग करेगा, और फिर उस की डिफ़ॉल्ट अनुक्रमित संपत्ति तक पहुंच जाएगा। न केवल वास्तविक अस्पष्टता है, लेकिन कभी-कभी 'Foo.Text [3]' का अर्थ स्पष्ट हो सकता है, लेकिन 'var blah = foo.Text;' नहीं हो सकता है। नामित गुण कोड को बाद में मना करते समय पूर्व को अनुमति देने की अनुमति देते हैं। – supercat

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