2011-01-15 3 views
40

मुझे यह जानकर उत्सुकता है कि (नाम) संपत्ति है, जो फॉर्म क्लास के नाम का प्रतिनिधित्व करती है। इस संपत्ति का उपयोग नामस्थान के भीतर किया जाता है ताकि वर्ग को विशिष्ट रूप से पहचानने के लिए कि फॉर्म एक उदाहरण है और, Visual Basic के मामले में, फ़ॉर्म के डिफ़ॉल्ट उदाहरण तक पहुंचने के लिए उपयोग किया जाता है।VB.Net में प्रत्येक रूप का डिफ़ॉल्ट उदाहरण क्यों है लेकिन सी # में नहीं?

अब जहां यह डिफ़ॉल्ट इंस्टेंस आया है, सी # के पास इसके बराबर विधि क्यों नहीं हो सकती है।

भी उदाहरण सी # में एक रूप को दिखाने के लिए के लिए हम कुछ इस तरह करते हैं:

// Only method 
Form1 frm = new Form1(); 
frm.Show(); 

लेकिन VB.Net में हम दोनों तरीकों से यह करने के लिए है:

' First common method 
Form1.Show() 

' Second method 
Dim frm As New Form1() 
frm.Show() 
  1. मेरे प्रश्न इस पहली विधि से आता है। यह Form1 क्या है, क्या यह Form1 या Form1 कक्षा का एक उदाहरण है? अब जैसा कि मैंने उपरोक्त उल्लेख किया है, फॉर्म नाम VB.Net में डिफ़ॉल्ट उदाहरण है। लेकिन हम यह भी जानते हैं कि Form1Designer में परिभाषित एक वर्ग है, तो इंस्टेंस और क्लास नाम दोनों के लिए नाम समान कैसे हो सकते हैं? यदि Form1 एक वर्ग है तो शो() नामक कोई (स्टेटिक \ साझा) विधि नहीं है। तो यह विधि कहां से आती है?

  2. जेनरेट आईएल में उनके क्या अंतर है?

  3. और अंततः सी # के बराबर क्यों नहीं हो सकता है?

+2

"उत्पन्न आईएल में उनके पास क्या अंतर है": डाउनलोड करें और अपने लिए पता लगाने के लिए .NET परावर्तक का उपयोग करें। यह बेहद उपयोगी और मुफ्त है। –

+2

मैं सी # में यह "फीचर" नहीं चाहता ... यह इस तथ्य को छिपाने के लिए सिर्फ एक चाल है कि आपको इसका उपयोग करने के लिए कक्षा का उदाहरण बनाना होगा। यह वास्तव में एक भयानक विचार है! इसके अलावा, यह बहुत खराब दस्तावेज है, और अप्रत्याशित और खतरनाक साइड इफेक्ट है (उदाहरण के लिए प्रत्येक थ्रेड का अपना "डिफ़ॉल्ट उदाहरण" टी फॉर्म है) –

+0

@ थॉमस लेवेस्क मुझे यह सुविधा नहीं चाहिए .. मैं सिर्फ यह जानना चाहता था कि यह कैसे किया गया और क्या यह संभव है .. :) –

उत्तर

31

यह वीबीएनईटी के संस्करण में भाषा में वापस जोड़ा गया था जो वीएस2005 के साथ आया था। लोकप्रिय मांग के अनुसार, वीबी 6 प्रोग्रामर को उस प्रकार के किसी ऑब्जेक्ट के संदर्भ और किसी संदर्भ के बीच अंतर देखने के साथ कठिन समय था। फॉर्म 1 बनाम एफएमएम अपने स्निपेट में। इसके लिए इतिहास है, वीबी को वीबी 4 तक कक्षाएं नहीं मिलीं, जबकि फॉर्म वीबी 1 पर वापस जाते हैं। यह अन्यथा प्रोग्रामर के दिमाग में काफी अप्रिय है, समझना कि अंतर बहुत प्रभावी ऑब्जेक्ट उन्मुख कोड लिखने पर शॉट प्राप्त करने के लिए महत्वपूर्ण है। इस कारण का एक बड़ा हिस्सा है कि सी # में यह नहीं है।

आप इसे वापस सी # में भी प्राप्त कर सकते हैं, भले ही यह काफी साफ नहीं होगा क्योंकि सी # VB.NET जैसे वैश्विक नामस्थान में गुणों और विधियों को जोड़ने की अनुमति नहीं देता है। आप अपने प्रपत्र कोड को गोंद का एक सा जोड़ सकते हैं, इस तरह:

public partial class Form2 : Form { 
    [ThreadStatic] private static Form2 instance; 

    public Form2() { 
     InitializeComponent(); 
     instance = this; 
    } 

    public static Form2 Instance { 
     get { 
      if (instance == null) { 
       instance = new Form2(); 
       instance.FormClosed += delegate { instance = null; }; 
      } 
      return instance; 
     } 
    } 
} 

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

संयोग से, उस स्निपेट में [थ्रेडस्टैटिक] विशेषता है जो कई वीबीएनईटी प्रोग्रामर ने पूरी निराशा में थ्रेडिंग छोड़ दी है। एक समस्या जब अमूर्त leaky है। आप वास्तव में इसे बिल्कुल न करने से बेहतर हैं।

+0

यकीन है कि मैं यह नहीं करूँगा;) .. Thanx आपके * गोंद के लिए बहुत कुछ * यह मुझे यह समझने के लिए एक बेहतर समझ देता है कि यह क्या हुआ। –

+3

वीबी.Net में इसे जोड़ने का एक महत्वपूर्ण कारण वीबी 1-3 से VB.Net तक मौजूदा कोड को पोर्ट करने में मदद करना था, जहां सुविधा का उपयोग किया जाएगा क्योंकि कोई विकल्प नहीं था। यही कारण है कि मुझे खुशी है कि इसे जोड़ा गया था: व्यक्तिगत रूप से मुझे नहीं लगता कि इसे नए कोड में इस्तेमाल किया जाना चाहिए। इस सुविधा के लिए मेरे समर्थन और वीबी 6 के साथ कुछ अनुभव के बावजूद, मुझे नहीं लगता कि मुझे व्यक्तिगत रूप से किसी प्रकार के प्रकार और किसी प्रकार के उदाहरण के संदर्भ में अंतर को समझने में कोई समस्या है :) – MarkJ

+2

तो मूल रूप से VB.NET भाषा संशोधित की गई थी क्योंकि उपयोगकर्ता ओओपी को समझने के लिए बहुत बेवकूफ थे ... मैं हमेशा इस बात से हैरान हूं कि इस भाषा को कितने तरीकों से त्रुटिपूर्ण तरीके से प्रबंधित किया जाता है, जबकि अभी भी सी # जैसी ही विशेषताएं हैं। –

23

वीबी मूल रूप से आपकी पीठ के पीछे आपकी परियोजना में कोड का एक भार जोड़ रहा है।

एक न्यूनतम परियोजना बनाने और प्रतिबिंबक के साथ इसे देखने के लिए क्या हो रहा है यह देखने का सबसे आसान तरीका है। मैं सिर्फ वीबी के साथ एक नया WinForms एप्लिकेशन बनाया है और इस वर्ग को जोड़ दिया है:

Public Class OtherClass  
    Public Sub Foo() 
     Form1.Show() 
    End Sub 
End Class 

फू के लिए संकलित कोड इस तरह दिखता है जब के रूप में सी # decompiled:

public void Foo() 
{ 
    MyProject.Forms.Form1.Show(); 
} 

MyProject.Forms उत्पन्न में एक संपत्ति है MyProject वर्ग, MyForms टाइप करें। जब आप इसमें डाइविंग शुरू करते हैं तो आप वहां बड़ी संख्या में जेनरेट कोड देखते हैं।

सी # यह सब कुछ कर सकता है - लेकिन आमतौर पर आपके पीछे पीछे काफी कुछ करने का इतिहास नहीं होता है। यह गुमनाम प्रकार, इटरेटर ब्लॉक, लैम्ब्डा एक्सप्रेशन इत्यादि जैसी चीजों के लिए अतिरिक्त विधियों और प्रकारों का निर्माण करता है - लेकिन वैसे ही नहीं, जैसे वीबी यहां करता है। सी # बनाता है जो कोड आपके द्वारा लिखे गए स्रोत कोड से मेल खाता है - बस चालाकी से रूपांतरित हो गया है।

निश्चित रूप से दोनों दृष्टिकोणों के लिए तर्क हैं। व्यक्तिगत रूप से मैं सी # दृष्टिकोण पसंद करता हूं, लेकिन शायद यह कोई आश्चर्य नहीं है। मुझे नहीं लगता कि एक फॉर्म के उदाहरण को एक्सेस करने का तरीका क्यों होना चाहिए जैसे कि यह सिंगलटन था लेकिन फॉर्म के लिए केवल ... मुझे भाषा पसंद है ताकि मैं जीयूआई का उपयोग कर रहा हूं मूल रूप से कक्षाएं या कुछ और।

+0

फॉर्म 1। शो() त्रुटि उत्पन्न कर रहा है '' WindowsAplication2.Form1 'अपने डिफ़ॉल्ट उदाहरण के माध्यम से स्वयं को संदर्भित नहीं कर सकता है; इसके बजाय 'मुझे' का उपयोग करें। –

+3

@ जावेद: तो संभवतः आप इसे किसी दूसरे वर्ग से उपयोग नहीं कर रहे हैं, जैसे कि मैं अपने उदाहरण में हूं। –

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