2012-09-12 10 views
12

सी # में, एक संपत्ति का सेटटर value कीवर्ड स्वचालित रूप से संपत्ति के प्रकार के समान ही होगा।वीबी.नेट संपत्ति के सेटटर को टाइप किए गए तर्क की आवश्यकता क्यों होती है और यह ByVal क्यों है?

उदाहरण के लिए, सी # में, value के प्रकार string

private string str = string.Empty; 
public string MyText 
{ 
    get { return str; } 
    set { str = value; } 
} 

है अगर हम VB.Net को यह टुकड़ा परिवर्तित करने पर हम पाते

Private str As String = String.Empty 
Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal value As String) 
     str = value 
    End Set 
End Property 

प्रश्न

  1. सेट में यह लिन क्यों है ई Set(ByVal value As String)? मूल्य स्वचालित रूप से स्ट्रिंग नहीं होना चाहिए। इस तरफ।

    Private str As String = String.Empty 
    Public Property MyText() As String 
        Get 
         Return str 
        End Get 
        Set 
         str = value 
        End Set 
    End Property 
    

    इसका क्या उपयोग है?

  2. मैं BYValByRef (मैंने कोशिश की, यह त्रुटि देता है) को बदल नहीं सकता है, तो इसका क्या उपयोग है?

+3

अच्छा सवाल, यह सुनिश्चित नहीं है कि इसे सीधे बल्ले से 1 क्यों दिया गया था। –

+0

@AlastairPitts: शायद भ्रमित शीर्षक की वजह से। –

उत्तर

9

आप (ByVal value As String) भाग को छोड़ सकते हैं। विजुअल स्टूडियो इसे जोड़ता रहेगा, लेकिन यह भाषा या न ही संकलक द्वारा आवश्यक नहीं है।

आप value के अलावा पैरामीटर नाम का उपयोग कर सकते हैं। यह भी ध्यान रखें कि वीएस -2010 एसपी 1 के बाद से, आप ByVal कीवर्ड को छोड़ सकते हैं।


उदाहरण:

Class Test 

    Private str As String = String.Empty 

    Public Property MyText() As String 
     Get 
      Return str 
     End Get 
     Set 
      str = value 
     End Set 
    End Property 

    Public Property MyText2() As String 
     Get 
      Return str 
     End Get 
     Set(something As String) 
      str = something 
     End Set 
    End Property 

End Class 
+0

अरे अगर मैं इसे हटा देता हूं, जैसा आपने कहा था, विजुअल स्टूडियो स्वचालित रूप से इसे जोड़ता है। –

+0

@ निखिल अग्रवाल - कि वीएस संपादक इसे जोड़ने पर जोर दे रहा है (इसी तरह यदि आप इसे हटाते हैं तो यह 'ByVal' वापस जोड़ देगा)। लेकिन विजुअल बेसिक * भाषा * इन चीजों की आवश्यकता नहीं है। –

+0

@ निखिल अग्रवाल इसका मतलब यह नहीं है कि संकलक को इसकी आवश्यकता है। – sloth

2

मुझे लगता है कि, विजुअल बेसिक में वाक्य रचना की अपनी ओर से। यदि आप OptionStrict चालू नहीं हैं, तो आप डेटा प्रकार को छोड़ सकते हैं। लेकिन यदि आप प्रकार निर्दिष्ट करते हैं, तो यह संपत्ति प्रकार के समान होना चाहिए।

From MSDN - Set Statement (Visual Basic)

डेटाप्रकार
किए जाने पर आवश्यक विकल्प सख्त पर है। मूल्य पैरामीटर का डेटा प्रकार। निर्दिष्ट डेटा प्रकार संपत्ति के डेटा प्रकार के समान होना चाहिए जहां यह सेट कथन घोषित किया गया है।

2

आप नाम पैरामीटर का बदलने के लिए VB में अनुमति दी जाती है क्योंकि:

Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal val As String) 
     str = val 
    End Set 
End Property 

आप ByRef को ByVal नहीं बदल सकते क्योंकि संपत्ति मापदंडों ही कभी मूल्य द्वारा पारित किया जा सकता । लेकिन वीबी कभी-कभी उन तथ्यों को बताता है जो अस्थिर हैं।

डेवलपर्स (सिद्धांत में) आप करते हैं हो सकता है बस है:

Set(val) 

क्योंकि और कुछ नहीं परिवर्तनीय है। लेकिन उन्होंने गुणों के लिए पैरामीटर बनाने का विकल्प Function एस और Sub एस के पैरामीटर जैसा दिखता है।


वास्तव में, आप नहीं पर सभी पैरामीटर निर्दिष्ट करने के लिए है। वीबी भाषा spec के अनुसार (9.7।2): एक पैरामीटर सूची निर्दिष्ट किया जाता है

हैं, तो यह एक सदस्य होना आवश्यक है, कि सदस्य ByVal को छोड़कर कोई संशोधक होनी आवश्यक है और इसके प्रकार संपत्ति के प्रकार के समान होना चाहिए। पैरामीटर सेट होने वाले संपत्ति मूल्य का प्रतिनिधित्व करता है। पैरामीटर शामिल न करने पर, एक पैरामीटर का नाम Value परोक्ष

और (9.5.2) घोषित किया जाता है:

एक पैरामीटर है कि ByVal करने के लिए ByRef या ByVal चूक निर्दिष्ट नहीं है।

1

यदि मान ByRef थे, सेटर फोन करने वाले का मूल्य को संशोधित करने में सक्षम होगा। किसी संपत्ति सेटर को इस तरह के दुष्प्रभावों का कारण बनने की इजाजत नहीं है।

0

आपके पास मूल्य enum हो सकता है और उदाहरण के लिए एक चुनिंदा मामला कर सकता है और उस तरह का मान सेट कर सकता है। आपको केवल उसी वैल्यू प्रकार को पास करने के लिए प्रॉपर्टी के सेट कॉल को सीमित करने की आवश्यकता नहीं है जो एक अच्छी सुविधा है

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