2011-03-03 9 views
8

यहाँ मैं किस बारे में बात कर रहा हूँ का एक उदाहरण है ...एक इंस्टेंस वैरिएबल के माध्यम से आप किसी साझा/स्थैतिक सदस्य तक क्यों नहीं पहुंच सकते?

Public Class Sample1 

    Public Shared Function MyValue() As Integer 
     Return 0 
    End Function 

    Public Sub Code() 
     Dim ThisIsBad = Me.MyValue 
     Dim ThisIsGood = Sample1.MyValue 
    End Sub 

End Class 

Me.MyValue VB.NET में एक चेतावनी देता है और (समकक्ष कोड देता है) सी # में एक त्रुटि। क्या इसके लिए कोई विशेष कारण है? मुझे 'Me.MyValue' का उपयोग करके साझा फ़ंक्शन तक पहुंचने के लिए यह अधिक सहज/प्राकृतिक लगता है - लेकिन मैं इसे अपनी चेतावनियों को 0

क्या किसी और ने अभी फैसला किया है 'नहीं, यह करने के लिए और अधिक समझदारी है दूसरी तरफ 'या क्या कोई तकनीकी कारण है जिसे मैं समझ नहीं पा रहा हूं?

संपादित करें:

सभी को धन्यवाद। मैं ओओपी में 'सब क्लास' की तरह गलत सोच रहा था। यहां तक ​​कि यदि बेस क्लास में कुछ घोषित किया गया है, तो आप इसे अपने उदाहरण के माध्यम से एक्सेस कर सकते हैं। लेकिन वह रिश्ता साझा या स्थैतिक के साथ समान नहीं है। परिभाषा के द्वारा

उत्तर

7

स्टेटिक सदस्यों वर्ग स्तर, नहीं उदाहरण के स्तर है, और इसलिए एक स्थिर सदस्य this (या VB में me) का उपयोग तक पहुँचने वास्तव में सही नहीं लगता है पर घोषित कर दिया जाता है (और सही नहीं सी # में है)

this.something कह रही है (या me.something) का अर्थ है आप "कुछ" है कि उस विशिष्ट उदाहरण के लिए विशेष रूप से है, जबकि, फिर से, स्थिर सदस्यों को बताया कि वर्ग के सभी उदाहरणों भर साझा कर रहे हैं तक पहुँच रहे हैं। वर्तमान उदाहरण Sample1 की को

+0

यह। MyValue फ़ंक्शन किसी एक उदाहरण से संबंधित नहीं है; इस प्रकार इसे एक ही उदाहरण की सीमाओं के बाहर पहुंचाया जाना चाहिए। मेरे # सी समकक्ष का उपयोग करने का प्रयास कर रहा है। MyValue के परिणामस्वरूप एक कंपाइलर त्रुटि होगी, इसलिए यदि वीबी में इसकी अनुमति है तो यह खराब है। – KeithS

+0

@ किथ्स - क्या आपका इरादा है कि उत्तर देने के लिए, या मेरे उत्तर पर एक टिप्पणी? –

+2

एक टिप्पणी। मैं वही कहने जा रहा था जो आपने किया था, इसलिए मैंने अभी आपको ऊपर उठाया और कहा कि यह मेरा तरीका है। :) – KeithS

2

Me अंक है, जबकि MyValueवर्ग खुद के हैं करता है। इस प्रकार, यह मेरे लिए ठीक लगता है कि वीबी.नेट आपको चेतावनी देता है।

वैसे, जावा उसी तरह से यह करता है:

Thread.currentThread().sleep(1000); // warning, as sleep is static 
Thread.sleep(1000); // correct 

चीयर्स मथायस

3

यह अपने कोड के पाठक के लिए भ्रामक है।

कोड किसी अन्य प्रोग्रामर द्वारा पढ़ने और समझने के लिए लिखा जाना चाहिए, इसलिए परियोजना के हर विवरण को नहीं पता है। एक उदाहरण के माध्यम से एक स्थिर चर का उपयोग करना यह एक उदाहरण सदस्य की तरह दिखता है - आपको यह देखने के लिए घोषणा करना होगा कि आप गलत हैं।

"अन्य प्रोग्रामर" भी आधा साल बाद हो सकता है।

1

संभावना से अधिक संकलक आपको उस मामले में गलती करने से बचा रहा है जहां आपके पास एक ही नाम का एक उदाहरण और स्थिर सदस्य है।

class X { 

    static public void X1() 
    { 
     Console.WriteLine ("Static"); 
    } 

    public void X1 (bool x1 = false) 
    { 
     X1(); // Which one is this calling? 
     Console.WriteLine ("Instance"); 
    } 
} 

void Main() 
{ 
    X.X1(); // Static 
    new X().X1 (false); // Instance 
} 

परिणामों में:

  • स्टेटिक
  • स्टेटिक
  • उदाहरण
2

स्थिर members/methodsclass level (यानी व्यवहार किसी भी वस्तु उदाहरण से स्वतंत्र है) और संचालित object's members/methodsपर संचालित है, तो वे दो अलग-अलग पहचान है: - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

1

आप this संदर्भ द्वारा श्रेणी स्तर क्षेत्रों तक नहीं पहुँच सकता है और आप वर्ग द्वारा वस्तु स्तर क्षेत्रों तक नहीं पहुँच सकता संदर्भ यह सही समझ में आता है।

तुम अजीब कोड निम्नलिखित लग सकती है आप this सूचक द्वारा श्रेणी स्तर क्षेत्र तक पहुँचने के लिए थे, तो

objA.StaticVariable=1; 
objB.StaticVariable=2; 

जो किसी को है कि हम वास्तव में अलग गुण या क्षेत्रों संपादित कर रहे थे भटका सकता है, लेकिन वे द्वारा उपयोग कर रहे हैं वर्ग का नाम

Class.StaticVariable=1 
Class.StaticVariable=2 

यह स्पष्ट है कि हम एक ही चीज़ संपादित कर रहे हैं।

ऑब्जेक्ट फ़ील्ड की तुलना में मेमोरी स्थिर फ़ील्ड पूरी तरह से अलग जगह (Type ऑब्जेक्ट के करीब) में संग्रहीत हैं, इसलिए मुझे लगता है कि इसका सुपर स्पष्ट अंतर है।

असली सवाल यह है - क्यों यह VB.NET में कोई त्रुटि नहीं है। मुझे लगता है कि उत्तर टीबीटी वीबी पुरानी गैर .NET वीबी सुविधाओं को विरासत में मिला था जो बहुत ही सुरक्षित नहीं थे और यह इस तरह के विरासत का अजीब परिणाम था।

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

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