2010-10-01 11 views
5

यह निश्चित रूप से एक नोब सवाल का थोड़ा सा है, लेकिन मेरी खोजों ने इतनी दूर तक मेरे लिए इस मुद्दे को मंजूरी नहीं दी है।सी #: (स्टेटिक) कक्षा-स्तर चर

ए एक विशेष कंसोल ऐप को कई क्लास-स्तरीय चर स्टोर करने के लिए चाहते हैं। एक मामले में, मैं अपनी लॉगिंग ऑब्जेक्ट की एक प्रति स्टोर करना चाहता हूं, जिसे मैं कक्षा के विभिन्न स्थानों में उपयोग करूंगा। एक और मामले में, मैं एक साधारण प्रकार, एक int मूल्य वास्तव में स्टोर करना चाहता हूं, जो केवल आंतरिक रूप से उपयोग किया जा रहा है (संपत्ति होने की आवश्यकता नहीं है)।

ऐसा प्रतीत होता है कि जब तक कि मैं इन चरों को स्थैतिक के रूप में निर्दिष्ट नहीं करता, मैं उन्हें मुख्य() और उससे आगे में उपयोग नहीं कर सकता।

स्थिर वस्तुओं की मेरी समझ यह है कि उनके मूल्य किसी ऑब्जेक्ट के सभी उदाहरणों में साझा किए जाते हैं। सामान्य ऑपरेशन के तहत, मैं उम्मीद करता हूं कि वे मेरे ऐप का केवल एक उदाहरण हों, इसलिए यह समस्या कोई समस्या नहीं है - लेकिन इसने मेरे मूलभूत रूप से कुछ ऐसे हिस्से के बारे में समझने की कमी पर प्रकाश डाला है जो काफी मौलिक है।

मामले में, मेरे लॉगिंग ऑब्जेक्ट के मामले में, मैं इसे स्थिर बनाने के लिए एक मामला देख सकता था - कई उदाहरणों में एक लॉग साझा करना एक लाभ हो सकता है। हालांकि, यह मामला नहीं हो सकता है ... मेरे int के मामले में, मैं निश्चित रूप से यह कभी भी उदाहरणों में साझा नहीं करना चाहता था।

तो ...

  • मैं इस के पीछे सिद्धांत गलत समझ रहा हूं?
  • क्या मुझे अलग-अलग तरीके से घोषित किया जाना चाहिए और मेरे वर्ग-स्तर चर का उपयोग करना चाहिए?
  • क्या मुझे उनका उपयोग करने से परहेज करना चाहिए? मैं फ़ंक्शन से कार्य करने के पैरामीटर के रूप में मूल्यों को बस पास कर सकता हूं, हालांकि यह स्पष्ट लाभ के लिए काम के लिए बहुत कुछ नहीं लगता है।

संपादित करें: ठीक है, संदेश स्पष्ट है - सांख्यिकी की मेरी समझ काफी हद तक सही थी, लेकिन समस्या संरचना और दृष्टिकोण में से एक थी। आपके उत्तरों के लिए धन्यवाद।

+0

नहीं वास्तव में और जवाब है, लेकिन इस की जाँच: http://en.wikipedia.org/wiki/Singleton_pattern – Brad

+0

आपका मुख्य() विधि स्थैतिक है, यही कारण है कि आप केवल स्थिर विधियों और चर से इसका उपयोग कर सकते हैं। –

+3

ऐपडोमेन * के भीतर किसी ऑब्जेक्ट के सभी उदाहरणों में स्टेटिक चर साझा किए जाते हैं। आपके आवेदन का प्रत्येक उदाहरण एक अलग ऐपडोमेन में रहता है। – Douglas

उत्तर

9

बस एक और कक्षा में अपने आवेदन, जो आप बनाते हैं और Main पद्धति पर अमल संपुटित।

+1

+1, और ["ग्लोबल वैरिएबल खराब हैं"] (http://c2.com/cgi/wiki?GlobalVariablesAreBad) यह समझाने का एक अच्छा काम करता है कि यह समस्या का सामना करने के लायक क्यों है। –

3

आपको अपने मुख्य समारोह के बाहर एक कक्षा बनाना चाहिए, और उसके बाद उस कक्षा का मुख्य भाग मुख्य रूप से बनाना चाहिए।

class MyApp { 
    private MyLog lol = new MyLog(); 
    private int myInt = 0; 

    public void Execute() { 
    // ... 
    } 
} 

class Program { 
    public static void Main() { 
    new MyApp().Execute(); 
    } 
} 

तुम अब भी लॉग क्षेत्र स्थिर अगर आप चाहते हैं कर सकते हैं:

ईजी

class MyConsoleApp 
{ 
    public static void Main() 
    { 
     MyClass mc = new MyClass(); 
    } 
} 

Class MyClass 
{ 
    private MyLog lol as new MyLog(); 
    private int myInt = 0; 
} 
2

यहां समस्या कम या ज्यादा पूरी तरह से वाक्य रचनात्मक है: क्योंकि एक स्थैतिक विधि केवल स्थिर फ़ील्ड तक पहुंच सकती है, और Main() विधि स्थिर होना आवश्यक है, इसके लिए उपयोग किए गए चर स्थिर होने की आवश्यकता होती है। आपने MyConsoleApp क्लास का कभी भी उदाहरण नहीं बनाया है।

यहाँ वास्तव में बहुत सिद्धांत नहीं, केवल व्यावहारिक आवश्यकताओं ...

थॉमस

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