2009-12-30 10 views
9

मुझे स्थिर/साझा सदस्यों की दृश्यता के साथ वीबी.नेट और सी # (.NET2) में एक स्थिति का सामना करना पड़ा है। यह VB.NET में एक छोटे से अजीब मुझे लगता है:स्थिर/वीबीएनईटी और सी # दृश्यता में साझा

public class A 
    { 
     private static A instance; 
     public static A Instance 
     { 
      get { return instance; } 
     } 

     public string Name { get { } } 
    } 

उपयोग: A.Instance.Name // ही नाम "दृश्यमान" है


VB.NET:

Public Class A 
    Private Shared _instance As A 

    Public Shared ReadOnly Property Instance() As A 
    Get 
     Return _instance 
    End Get 
    End Property 


    Public ReadOnly Property Name() As String 
    Get 
     Return "" 
    End Get 
    End Property 

End Class 

उपयोग:

A.Instance.Instance.Instance.Instance... 

// साझा सदस्य एक वर्ग सार्वजनिक एक मैं इसे अनंत को दोहरा सकते हैं की तरह बर्ताव करता ..

इस एक Microsoft भूल या एक VB.NET "सुविधा" है?

+3

अगर यह सच है तो मैं इसे करने के लिए जोड़ देंगे मेरी 'वीबी के बजाय सी # क्यों' की सूची ;-) –

+5

@AdamRalph: और यह समयपूर्व और अप्रत्याशित होगा। –

उत्तर

19

यह एक निरीक्षण नहीं है, लेकिन अपने VB कोड एक चेतावनी है, जो स्पष्ट रूप से इसका मतलब है ट्रिगर किया जाएगा: इस अंकन का उपयोग नहीं करते।

वीबी में, स्थिर सदस्यों एक उदाहरण के माध्यम से पहुँचा जा सकता है, सख्ती से बोला के बाद से, वीबी नहीं है static: वीबी, कीवर्ड Shared है, जिसका अर्थ सदस्य, सभी उदाहरणों के बीच साझा है कि के रूप में static का विरोध किया जहां एक सदस्य किसी भी उदाहरण से संबंधित नहीं है।

अब, यह उन खोजशब्दों के बीच एक अर्थात् भेद है। ऐसा ही होता है कि इन दो अलग-अलग अर्थशास्त्रों का सटीक प्रभाव होता है।

सी # में बेशक

, static VB.NET में आज Shared के समान है लेकिन उनकी विरासत अलग है और वीबी के Shared बस एक अलग इतिहास है और इसलिए ऐतिहासिक दृष्टि से एक अलग अर्थ है। के साथ यह अर्थ है, यह एक उदाहरण के माध्यम से Shared सदस्यों तक पहुंचने के लिए बिल्कुल समझ में आता है।

यह भी जब Option Strict Off (ढीला लिख ​​रहा है) के साथ उपयोग किया समझ में आता है: यहाँ, आप कभी कभी पता नहीं है एक चर के प्रकार लेकिन आप अभी भी एक Shared सदस्य तक पहुँचने के लिए चाहते हो सकता है। केवल प्रकार पर ही

Option Strict Off 
' … ' 
Dim o As Object = New A() 
' Somewhere else, we want to access a static member of A but we don’t know A: ' 
Dim instance = o.Instance 
+0

सी # अधिक सटीक और स्पष्ट लगता है कि वीबीएनईटी जिसे वीबी परिवार के साथ अपनी "ऐतिहासिक" संगतता पर विचार करना चाहिए। वैसे भी, सी # स्थिर सदस्यों की दृश्यता में डुप्लिकेट की अनुमति नहीं देता है - कक्षा के नाम के माध्यम से और कक्षा के उदाहरण के माध्यम से। इसके अलावा यह Instance.StaticMember.StaticMember जैसे फ़ील्ड कॉल को "infinitize" से रोकता है ... यह क्लास इंस्टेंस के उपयोगकर्ता को शर्मिंदा कर सकता है। – serhio

0

सी # संकलक आप एक वस्तु का एक उदाहरण पर एक स्थिर संपत्ति संदर्भ के लिए अनुमति नहीं दी जाएगी,: अब, आप, लेकिन यह तक पहुँचने के लिए एक उदाहरण का उपयोग करने के अलावा कोई चारा नहीं मिल गया है। यह .NET CLR प्रतिबंध के बजाय एक सी # है। वीबीएनईटी इसकी अनुमति देगा लेकिन इसके खिलाफ चेतावनी देगा।

+0

* यह एक .NET CLR प्रतिबंध के बजाय एक सी # है। * यह प्रतिबंध एक अच्छा है, IMHO, क्योंकि स्थिर सदस्यों की दृश्यता को डुप्लिकेट न करें - कक्षा के नाम के माध्यम से और कक्षा के उदाहरण के माध्यम से। इसके अलावा यह Instance.StaticMember.StaticMember.StaticMember.StaticMember.StaticMember ... फ़ील्ड कॉल को "infinitize" करने से रोकता है ... – serhio

+0

मैं और अधिक सहमत नहीं हो सका। –

9

यह एक विशेषता है; यह एक बग नहीं है। वीबी डिजाइन के रूप में काम कर रहा है। अलग-अलग भाषाएं इस बारे में अलग-अलग विकल्प बनाती हैं कि एक स्थिर विधि को किसी उदाहरण के तरीके के रूप में माना जा सकता है या नहीं। वीबी इसे अनुमति देता है। सी ++ इसे अनुमति देता है। सी # नहीं करता है।

याद रखें, विभिन्न भाषाओं के डिजाइन मानदंड अलग हैं, और इसलिए किए गए निर्णय अलग हैं।सी # डिजाइन टीम पर, हम एक भाषा परिभाषा का अत्यधिक महत्व रखते हैं जो अवैध पैटर्न बनाता है जो संदिग्ध लगते हैं; चूंकि का अर्थ है, उदाहरण के लिए रिसीवर को स्थिर विधि के रूप में पास करने के लिए (जब तक रिसीवर अभिव्यक्ति की गणना नहीं होती है) तो उपयोगकर्ता को अर्थहीन कोड टाइप करने की अनुमति क्यों दी जाती है?

वीबी डिज़ाइन टीम पर, वे पर काम करने वाले कोड को मानते हैं जिस तरह से आप इसे लिखने के लिए पहली बार काम करते थे; अगर कुछ थोड़ा डोडी दिखता है, तो शायद एक चेतावनी दें, लेकिन इसे अनुमति दें और आगे बढ़ें।

आप सी # में स्थिर कॉल के डिजाइन में और अधिक सूक्ष्म मुद्दों में से कुछ में रुचि रखते हैं, यहाँ एक दिलचस्प मुद्दा है:

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

+0

वास्तव में, जैसा कि मैंने अपने इंस्टेंस को * साझा * से अधिक * स्थिर * माना * मुझे सिंगलटन * इंस्टेंस * में एक और * इंस्टेंस * होने की उम्मीद नहीं थी और इसलिए ... – serhio

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