VB.NET में एक क्लास स्टेटिक को चिह्नित करना


85

जैसा कि हाल ही में एक प्रश्न और उत्तर में कहा गया है , आप एक स्थिर वर्ग से वारिस नहीं हो सकते। VB.NET के अंदर स्थिर वर्गों के साथ जाने वाले नियमों को कैसे लागू किया जाता है? चूँकि फ्रेमवर्क C # और VB के बीच संगत है, इसलिए यह समझ में आता है कि क्लास स्टैटिक को चिह्नित करने का एक तरीका होगा, लेकिन ऐसा प्रतीत नहीं होता है।

जवाबों:


121

मॉड्यूल == स्थिर वर्ग

यदि आप एक ऐसा वर्ग चाहते हैं जो आपको विरासत में नहीं मिल सकता है, तो एक NotInheritableवर्ग का उपयोग करें ; लेकिन यह स्थिर / साझा नहीं होगा। आप सभी तरीकों, गुणों और सदस्यों को चिह्नित कर सकते हैं Shared, लेकिन यह कड़ाई से सी # में एक स्थिर वर्ग के समान नहीं है क्योंकि यह संकलक द्वारा लागू नहीं किया गया है।

यदि आप वास्तव में VB.Net को C # स्थिर वर्ग के समतुल्य चाहते हैं, तो a का उपयोग करें Module। यह विरासत में नहीं मिल सकता है और सभी सदस्य, गुण और विधियाँ स्थिर / साझा हैं।


2
मैं अपनी पिछली टिप्पणी को वापस लेता हूं। मैं रिफ्लेक्टर में एक मॉड्यूल देख रहा था और IL इसे सील के रूप में दिखाता है।
— मैजिककट

27
क्या आप VBer हैं? एक मॉड्यूल एक नामस्थान की तरह है। सभी VB फ़ंक्शन VB के मॉड्यूल से आयात किए जाते हैं और वे सामान्य दायरे में उपलब्ध हैं। मेरी राय में vb में एक स्थिर वर्ग एक मॉड्यूल नहीं है, इसका अलग व्यवहार है। यदि आप vb में 'स्टैटिक क्लास' व्यवहार चाहते हैं, तो आपके पास NotInheritable होना चाहिए और सभी को 'Shared' सदस्य घोषित करना चाहिए, जैसे आपको C # स्टैटिक क्लास में करना होगा, वे उसी तरह का व्यवहार करेंगे। एक मॉड्यूल नहीं।
— शिम्मी वेइटहैंडलर

2
@ शमी मुझे नहीं पता कि मैंने पहले यह टिप्पणी कैसे याद की, लेकिन आप गलत हैं। उत्पन्न आईएल को देखें, और मॉड्यूल को स्थिर वर्ग के समान सटीक उपचार मिलता है। VB सिर्फ पुराने मानक कार्यों के लिए अतिरिक्त कार्य करता है ताकि उन्हें वैश्विक दायरे में प्रदर्शित किया जा सके।
— जोएल कोएहॉर्न

2
@JoelCoehoorn मॉड्यूल since स्थिर वर्ग चूंकि मॉड्यूल को सीधे नामस्थान में घोषित किया जाना चाहिए। इसका मतलब है कि कोई एक मॉड्यूल या कक्षा में एक मॉड्यूल घोषित नहीं कर सकता है।
— लॉसमनोस

20
@JoelCoehoorn तथ्य यह है कि मॉड्यूल और स्थिर वर्ग एक ही आईएल के साथ समाप्त होते हैं, यह जानना अच्छा है, लेकिन वीबी इसके अतिरिक्त मॉड्यूल के सदस्यों को युक्त नाम स्थान पर बढ़ावा देता है। पदोन्नति पहलू है जहां मॉड्यूल और स्थिर कक्षाओं व्यावहारिक उपयोग और IMHO कि एक बड़े पैमाने पर अंतर में मतभेद है। मैं अब तक NotInheritable - खाली निजी कंस्ट्रक्टर को पसंद करता हूं - सभी सदस्यों ने समाधान साझा किया क्योंकि सदस्यों को केवल कक्षा के माध्यम से ही पहुँचा जा सकता है, जो कि अधिक सटीक व्यवहार है यदि आप स्थैतिक-वर्ग तुल्यता प्राप्त करने की कोशिश कर रहे हैं। आईएल अलग हो सकता है, लेकिन यह वास्तव में अकादमिक है।
— misha256

51

लगभग वहाँ पहुँच गया। आप को रोकने के लिए मिल गया है, भी।

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • साझा स्थिर वर्ग की पद्धति की तरह है।
  • नोटबंदी सील की तरह है।
  • निजी न्यू जैसा है कि स्थिर वर्ग को त्वरित नहीं किया जा सकता है।

देखें:
MSDN - स्टेटिक क्लास और स्टेटिक क्लास मेंबर


2
यह स्वीकृत उत्तर क्यों नहीं है? कोड स्निप के लिए धन्यवाद
— आर्चरबर्ड

6

यदि आप बस एक ऐसी क्लास बनाना चाहते हैं जिसे आप विरासत में नहीं ले सकते, तो C # में आप सील का उपयोग कर सकते हैं, और VB.Net में NotInheritable का उपयोग कर सकते हैं।

स्थैतिक के बराबर VB.Net साझा किया गया है।


जैसा कि आप C # स्टेटिक क्लास में करना चाहते हैं, वैसे ही आप इसे वैरिएबल और फंक्शन्स को साझा करते हैं। NotInheritable के रूप में चिह्नित करना इसे सील कर देता है।
— शिमी वेइटहैंडलर

5

आप vb.net में स्टेटिक क्लास बना सकते हैं। उपाय है

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

AGE वैरिएबल सार्वजनिक स्थैतिक है, आप इसे इस तरह से अन्य कोड में उपयोग कर सकते हैं

 Dim myage As Integer = DB.AGE

मित्र = जनता, नोटरी = स्थिर


3
मित्र! = जनता, मित्र = आंतरिक
— अल्टेयर

1
Notheritable! = Static, NotInheritable == मुहरबंद
— मैग्नस

myage! = 20 (किसी भी अधिक, दुख की बात है)
— ग्रिम

2

सीएलआर दृष्टिकोण से, सी # स्थिर वर्ग सिर्फ "सील" और "सार" वर्ग है। आप एक उदाहरण नहीं बना सकते, क्योंकि यह अमूर्त है, और इसे सील किए जाने के बाद से आप इसे प्राप्त नहीं कर सकते। बाकी बस कुछ संकलक जादू है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.