एक संरचना है, उसके दिल में, खेतों के एकत्रीकरण से अधिक और न ही कुछ भी कम नहीं है। .NET में यह एक संरचना के लिए एक वस्तु होने का ढोंग करना संभव है, और प्रत्येक संरचना के प्रकार के लिए। .NET स्पष्ट रूप से एक ही फ़ील्ड और विधियों के साथ एक ढेर ऑब्जेक्ट प्रकार को परिभाषित करता है जो - एक हीप ऑब्जेक्ट होने के नाते - एक वस्तु की तरह व्यवहार करेगा । एक चर जो इस तरह के ढेर ऑब्जेक्ट ("बॉक्सिंग" संरचना) के लिए एक संदर्भ रखता है, संदर्भ शब्दार्थ को प्रदर्शित करेगा, लेकिन जो सीधे एक संरचना रखता है वह बस चर का एक एकत्रीकरण है।
मुझे लगता है कि अधिकांश संरचना-बनाम-श्रेणी भ्रम इस तथ्य से उपजा है कि संरचनाओं में दो अलग-अलग उपयोग के मामले हैं, जिनके लिए बहुत अलग डिजाइन दिशानिर्देश होने चाहिए, लेकिन एमएस दिशानिर्देश उनके बीच अंतर नहीं करते हैं। कभी-कभी किसी वस्तु की आवश्यकता होती है जो एक वस्तु की तरह व्यवहार करती है; उस मामले में, एमएस दिशानिर्देश बहुत उचित हैं, हालांकि "16 बाइट सीमा" शायद 24-32 की तरह अधिक होनी चाहिए। कभी-कभी, हालांकि, जो आवश्यक है वह चर का एक एकत्रीकरण है। उस उद्देश्य के लिए उपयोग की जाने वाली संरचना में केवल सार्वजनिक क्षेत्रों का एक समूह होना चाहिए, और संभवतः एक Equals
ओवरराइड, ToString
ओवरराइड औरIEquatable(itsType).Equals
कार्यान्वयन। संरचनाएं जो खेतों के एकत्रीकरण के रूप में उपयोग की जाती हैं, वे ऑब्जेक्ट नहीं हैं, और होने का नाटक नहीं करना चाहिए। संरचना के दृष्टिकोण से, क्षेत्र का अर्थ "इस क्षेत्र के लिए लिखी गई अंतिम चीज" से अधिक या कम नहीं होना चाहिए। किसी भी अतिरिक्त अर्थ को ग्राहक कोड द्वारा निर्धारित किया जाना चाहिए।
उदाहरण के लिए, यदि एक चर-समुच्चय संरचना में सदस्य हैं Minimum
और Maximum
, संरचना को स्वयं कोई वादा नहीं करना चाहिए Minimum <= Maximum
। एक पैरामीटर के रूप में ऐसी संरचना प्राप्त करने वाले कोड को ऐसा व्यवहार करना चाहिए मानो इसे अलग Minimum
और Maximum
मानों के साथ पारित किया गया हो । एक आवश्यकता जो Minimum
किसी से अधिक नहीं Maximum
होनी चाहिए उसे एक आवश्यकता की तरह माना जाना चाहिए कि एक Minimum
पैरामीटर अलग-अलग पारित होने से अधिक नहीं है Maximum
।
कभी-कभी विचार करने के लिए एक उपयोगी पैटर्न ExposedHolder<T>
कुछ इस तरह से परिभाषित एक वर्ग है:
class ExposedHolder<T>
{
public T Value;
ExposedHolder() { }
ExposedHolder(T val) { Value = T; }
}
यदि किसी के पास एक चर है List<ExposedHolder<someStruct>>
, जहां someStruct
एक चर-समुच्चय संरचना है, तो कोई भी ऐसा काम कर सकता है myList[3].Value.someField += 7;
, लेकिन myList[3].Value
दूसरे कोड को देने से इसे Value
बदलने का साधन देने की बजाय सामग्री मिलेगी । इसके विपरीत, यदि कोई उपयोग करता है List<someStruct>
, तो इसका उपयोग करना आवश्यक होगा var temp=myList[3]; temp.someField += 7; myList[3] = temp;
। यदि कोई परस्पर श्रेणी के प्रकार का उपयोग करता है, तो myList[3]
बाहरी कोड की सामग्री को उजागर करने के लिए सभी फ़ील्ड को किसी अन्य ऑब्जेक्ट पर कॉपी करने की आवश्यकता होगी। यदि कोई अपरिवर्तनीय वर्ग प्रकार, या "ऑब्जेक्ट-स्टाइल" संरचना का उपयोग करता है, तो एक नए उदाहरण का निर्माण करना आवश्यक होगा जो myList[3]
इसके अलावा someField
अलग था, और फिर उस नए उदाहरण को सूची में संग्रहीत करें।
एक अतिरिक्त ध्यान दें: यदि आप बड़ी संख्या में समान चीजों का भंडारण कर रहे हैं, तो संरचनाओं के संभवतः-नेस्टेड सरणियों में उन्हें स्टोर करना अच्छा हो सकता है, अधिमानतः प्रत्येक सरणी का आकार 1K और 64K के बीच रखने की कोशिश कर रहा है। संरचनाओं की सारणियां विशेष हैं, उस अनुक्रमण में एक संरचना के भीतर एक सीधा संदर्भ मिलेगा, इसलिए कोई "[12] .x = 5;" कह सकता है। यद्यपि कोई सरणी जैसी वस्तुओं को परिभाषित कर सकता है, सी # उन्हें सरणियों के साथ इस तरह के वाक्यविन्यास को साझा करने की अनुमति नहीं देता है।