2012-11-14 13 views
10

मुझे हाल ही में पता चला है कि सी # में structs के तरीके हो सकते हैं।एक स्थिर संरचना विधि और स्थैतिक वर्ग विधि के बीच क्या अंतर है?

काफी गलती से, मैंने खुद को एक स्थिर वर्ग की स्थैतिक विधि के बजाय अपने कोड में एक खाली संरचना की स्थिर विधि का उपयोग करने के लिए पाया है, जिसे मैंने सोचा था कि मैं काम कर रहा था!

उदा।

public struct Foo 
{ 
    public static void Bar(Param param) 
    { 
     ... 
    } 
} 

यह वास्तव में इस बिंदु पर एक संरचना के रूप में उपयोग नहीं किया जा रहा है, क्योंकि इसमें कोई गुण नहीं है!

क्या यह कक्षा (स्थैतिक या अन्यथा) की स्थिर विधि का उपयोग करने से बहुत अलग है? क्या एक दूसरे को पसंद करने के कोई कारण हैं? (मेरे पेट मुझसे कहता है कि स्थिर struct विधि का उपयोग कम से कम, कम सहज में, है)

उत्तर

16

नहीं है, स्थिर सदस्यों प्रकार और प्रकार की उदाहरणों के लिए नहीं के हैं। स्थैतिक वर्ग के सदस्यों और स्थैतिक संरचना सदस्यों की घोषणा के बीच कोई अंतर नहीं है (न तो प्रदर्शन और न ही अर्थशास्त्र के संबंध में)।

यह ध्यान रखना महत्वपूर्ण है कि यदि किसी प्रकार का एकमात्र फ़ंक्शन स्थिर सदस्यों को रखना है, तो आपको इसके बजाय एक स्थिर वर्ग का उपयोग करना चाहिए। Structs के साथ, एक निहित और अपरिवर्तनीय सार्वजनिक, नो-तर्क कन्स्ट्रक्टर है। यदि इस प्रकार के पास कोई उदाहरण विधि नहीं है, तो उदाहरण बनाने की क्षमता हटा दी जानी चाहिए। static को घोषित करना abstract sealed घोषित करने जैसा ही है, इसलिए डेवलपर आकस्मिक रूप से ऐसे उदाहरण नहीं बना पाएंगे जिनके पास कोई उद्देश्य नहीं है।

+3

कक्षा 'स्थैतिक' घोषित करने के लिए कंपाइलर को परिवर्तनीय घोषणाओं में प्रकार के किसी भी उपयोग को ध्वजांकित करने या त्रुटियों के रूप में होने की अनुमति देने के अतिरिक्त जोड़ा गया है ('अमूर्त सीलबंद' पर)। –

+0

@mikez वह भी, साथ ही त्रुटियों के रूप में किसी भी घटना सदस्य घोषणाओं को ध्वजांकित करना। – cdhowie

+3

@ माइकज़ मुझे लगता है कि एक और महत्वपूर्ण भेद यह है कि 'अमूर्त सीलबंद वर्ग' केवल अमान्य सी # है। – svick

3

व्यवहार अलग नहीं है। संरचना और वर्ग सुविधाओं के चौराहे को बढ़ाकर सी # बेस्टर्डीकृत structs। व्यक्तिगत रूप से मैं सिर्फ एक वर्ग का उपयोग करता हूं क्योंकि यह मेरे लिए अधिक सही लगता है (निश्चित रूप से अधिकतर भाषाओं में सम्मेलनों के अनुरूप)।

+0

कोई भी पहले से ही C++ में संरचनाओं के लिए विधियों और रचनाकारों को परिभाषित कर सकता है, इसलिए यह एक नई नई सुविधा नहीं है जिसे पहली बार सी # में पेश किया गया था। – Jagger

+0

एक स्ट्रक्चर के बारे में क्या है जिसमें '[स्ट्रक्चरलाइट (लेआउटकिंड.एक्सप्लिट)] सेट है? इसे एक वर्ग द्वारा प्रतिस्थापित नहीं किया जा सका। –

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