C# में Struct या Class: शुरुआती को कब क्या चुनना चाहिए?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# में Struct या Class: शुरुआती और पेशेवरों की शाश्वत बहस

\n\n

क्या आपने कभी सोचा है कि C# में अपना डेटा टाइप बनाने के दो बहुत समान तरीके क्यों हैं — class और struct? और क्यों Stack Overflow पर प्रश्न «When should I use a struct rather than a class in C#?» हजारों बार देखा जाता है और सैकड़ों उत्तर प्राप्त करता है? बात यह है कि स्पष्ट सादगी के पीछे एक गहरी बारीकी छिपी है, जो आपके प्रोग्राम को तेज़ कर सकती है या इसे बगों का अड्डा बना सकती है।

\n\n

इस लेख में, हम समझेंगे कि struct, class से कैसे अलग है, struct का उपयोग कब करना चाहिए, और कब इसके अस्तित्व को भूल जाना बेहतर है। बिना कठिन शब्दों के, वास्तविक उदाहरणों और व्यावहारिक सुझावों के साथ। चलिए शुरू करते हैं!

\n\n

मुख्य अंतर: स्टैक या हीप?

\n\n

सबसे महत्वपूर्ण बिंदु जिसे समझना आवश्यक है — मान प्रकार (value types) और संदर्भ प्रकार (reference types)।

\n\n
    \n
  • Class — संदर्भ प्रकार। ऑब्जेक्ट प्रबंधित हीप (heap) में संग्रहीत होता है, और वेरिएबल में केवल उस ऑब्जेक्ट का संदर्भ (पता) होता है।
  • \n
  • Struct — मान प्रकार (value type)। वेरिएबल सीधे स्टैक (stack) में या किसी अन्य ऑब्जेक्ट के अंदर डेटा संग्रहीत करता है।
  • \n
\n\n

अमूर्त लगता है? आइए एक उदाहरण लेते हैं। कल्पना करें कि डेटा एक किताब है। Class — किताब का नाम और शेल्फ नंबर है जहाँ वह लाइब्रेरी में रखी है। Struct — वह किताब है जिसे आप अपनी जेब में रखते हैं। जब आप class को मेथड में भेजते हैं, तो आप शेल्फ नंबर भेजते हैं। जब आप struct भेजते हैं — तो आप किताब की एक प्रति देते हैं।

\n\n

कोड उदाहरण: class बनाम struct

\n\n
public class PointClass\n{\n    public int X { get; set; }\n    public int Y { get; set; }\n\n    public PointClass(int x, int y)\n    {\n        X = x;\n        Y = y;\n    }\n}\n\npublic struct PointStruct\n{\n    public int X { get; set; }\n    public int Y { get; set; }\n\n    public PointStruct(int x, int y)\n    {\n        X = x;\n        Y = y;\n    }\n}\n\n// उपयोग\nvar pointClass = new PointClass(10, 20);\nvar pointStruct = new PointStruct(10, 20);\n\n// मेथड में भेजना\nvoid ModifyPointClass(PointClass p) { p.X = 100; }\nvoid ModifyPointStruct(PointStruct p) { p.X = 100; }\n\nModifyPointClass(pointClass);   // pointClass.X 100 हो जाएगा\nModifyPointStruct(pointStruct); // pointStruct.X 10 ही रहेगा — प्रति!\n
\n\n

देखा? Struct भेजने पर कॉपी हो जाता है। यही मुख्य अंतर है जो यह निर्धारित करता है कि इसका उपयोग कब करना चाहिए।

\n\n

कब struct आपका मित्र है: 3 पक्के मामले

\n\n

माइक्रोसॉफ्ट struct का उपयोग करने की सलाह देता है, यदि आपका डेटा प्रकार निम्नलिखित सभी शर्तों को पूरा करता है:

\n\n

1. डेटा छोटा और सरल है

\n

Struct छोटे डेटा सेट (अनुशंसित 16-24 बाइट्स से अधिक नहीं) के लिए आदर्श है। उदाहरण के लिए, बिंदु, रंग, वेक्टर, सम्मिश्र संख्या, निर्देशांक।

\n\n
public struct RgbColor\n{\n    public byte R { get; }\n    public byte G { get; }\n    public byte B { get; }\n\n    public RgbColor(byte r, byte g, byte b)\n    {\n        R = r;\n        G = g;\n        B = b;\n    }\n}\n
\n\n

क्यों? क्योंकि छोटे struct जल्दी कॉपी होते हैं, और स्टैक में भंडारण से कचरा संग्रहकर्ता (GC) पर भार कम होता है।

\n\n

2. ऑब्जेक्ट अल्पकालिक होते हैं और बदलते नहीं हैं

\n

यदि आपका डेटा अपरिवर्तनीय (immutable) मान है, तो struct एक उत्कृष्ट विकल्प है। उदाहरण के लिए, मानचित्र पर निर्देशांक: आप बिंदु को नहीं बदलते, आप एक नया बनाते हैं।

\n\n
public struct GeoLocation\n{\n    public double Latitude { get; }\n    public double Longitude { get; }\n\n    public GeoLocation(double lat, double lon)\n    {\n        Latitude = lat;\n        Longitude = lon;\n    }\n\n    public GeoLocation MoveNorth(double meters)\n    {\n        // नया इंस्टेंस लौटाते हैं, पुराने को नहीं बदलते\n        return new GeoLocation(Latitude + meters / 111111.0, Longitude);\n    }\n}\n
\n\n

3. प्रदर्शन महत्वपूर्ण है

ब्लॉग

पुस्तक अनुशंसाएँ