C# में Struct या Class: शुरुआती और पेशेवरों की शाश्वत बहस
\n\nक्या आपने कभी सोचा है कि C# में अपना डेटा टाइप बनाने के दो बहुत समान तरीके क्यों हैं — class और struct? और क्यों Stack Overflow पर प्रश्न «When should I use a struct rather than a class in C#?» हजारों बार देखा जाता है और सैकड़ों उत्तर प्राप्त करता है? बात यह है कि स्पष्ट सादगी के पीछे एक गहरी बारीकी छिपी है, जो आपके प्रोग्राम को तेज़ कर सकती है या इसे बगों का अड्डा बना सकती है।
इस लेख में, हम समझेंगे कि struct, class से कैसे अलग है, struct का उपयोग कब करना चाहिए, और कब इसके अस्तित्व को भूल जाना बेहतर है। बिना कठिन शब्दों के, वास्तविक उदाहरणों और व्यावहारिक सुझावों के साथ। चलिए शुरू करते हैं!
\n\nमुख्य अंतर: स्टैक या हीप?
\n\nसबसे महत्वपूर्ण बिंदु जिसे समझना आवश्यक है — मान प्रकार (value types) और संदर्भ प्रकार (reference types)।
\n\n- \n
- Class — संदर्भ प्रकार। ऑब्जेक्ट प्रबंधित हीप (heap) में संग्रहीत होता है, और वेरिएबल में केवल उस ऑब्जेक्ट का संदर्भ (पता) होता है। \n
- Struct — मान प्रकार (value type)। वेरिएबल सीधे स्टैक (stack) में या किसी अन्य ऑब्जेक्ट के अंदर डेटा संग्रहीत करता है। \n
अमूर्त लगता है? आइए एक उदाहरण लेते हैं। कल्पना करें कि डेटा एक किताब है। Class — किताब का नाम और शेल्फ नंबर है जहाँ वह लाइब्रेरी में रखी है। Struct — वह किताब है जिसे आप अपनी जेब में रखते हैं। जब आप class को मेथड में भेजते हैं, तो आप शेल्फ नंबर भेजते हैं। जब आप struct भेजते हैं — तो आप किताब की एक प्रति देते हैं।
\n\nकोड उदाहरण: class बनाम struct
\n\npublic 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 का उपयोग करने की सलाह देता है, यदि आपका डेटा प्रकार निम्नलिखित सभी शर्तों को पूरा करता है:
1. डेटा छोटा और सरल है
\nStruct छोटे डेटा सेट (अनुशंसित 16-24 बाइट्स से अधिक नहीं) के लिए आदर्श है। उदाहरण के लिए, बिंदु, रंग, वेक्टर, सम्मिश्र संख्या, निर्देशांक।
\n\npublic 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\n2. ऑब्जेक्ट अल्पकालिक होते हैं और बदलते नहीं हैं
\nयदि आपका डेटा अपरिवर्तनीय (immutable) मान है, तो struct एक उत्कृष्ट विकल्प है। उदाहरण के लिए, मानचित्र पर निर्देशांक: आप बिंदु को नहीं बदलते, आप एक नया बनाते हैं।
\n\npublic 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