पर असाइन करें मुख्य प्रश्न यह है कि इस कीवर्ड को उपयोगिता और स्मृति के संबंध में संशोधित करने की अनुमति देने के प्रभाव क्या हैं; और यह सी # भाषा विनिर्देशों में क्यों अनुमति है?इस कीवर्ड को C#
अन्य प्रश्न/उपपृष्ठों का उत्तर दिया जा सकता है या नहीं, अगर ऐसा करना है। मैंने सोचा कि उनके जवाब उत्तर मुख्य प्रश्न के उत्तर को स्पष्ट करने में मदद करेंगे।
मैं What's the strangest corner case you've seen in C# or .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
के जवाब के रूप में इस भर में भाग गया मैं चारों ओर क्यों सी # भाषा विनिर्देशों भी इस अनुमति होगी मेरे सिर लपेटो करने की कोशिश कर रहा हूँ। उप-भाग 1। क्या ऐसा कुछ भी है जो को उचित ठहराने वाला होगा संशोधित हो सकता है? क्या यह हर उपयोगी है?
कि जवाब देने के लिए टिप्पणियों में से एक सी # के माध्यम से
CLR से था: कारण वे इस बनाया है, क्योंकि आप एक और निर्माता में एक struct के parameterless निर्माता कॉल कर सकते हैं। यदि आप केवल एक संरचना के एक मान को प्रारंभ करना चाहते हैं और अन्य मान शून्य/शून्य (डिफ़ॉल्ट) होना चाहते हैं, तो आप सार्वजनिक Foo (int bar) {this = new foo() लिख सकते हैं; विशेष वार = बार;}। यह कुशल नहीं है और वास्तव में उचित नहीं है (विशेष वार दो बार असाइन किया गया है), लेकिन बस FYI। (यही कारण है कि पुस्तक में दी गई है, मैं क्यों हम सिर्फ सार्वजनिक फू (पूर्णांक बार नहीं करना चाहिए पता नहीं है): इस())
उप-भाग 2. मैं नहीं कर रहा हूँ यकीन है कि मैं उस तर्क का पालन करता हूं। क्या कोई इसका अर्थ स्पष्ट कर सकता है? शायद इसका एक ठोस उदाहरण कैसे इस्तेमाल किया जाएगा?
संपादित करें (उपेक्षा ढेर या ढेर मुख्य बिंदु स्मृति रिहाई या कचरा संग्रहण के संबंध में है। इसके बजाय पूर्णांक [] आपको लगता है कि 262,144 सार्वजनिक पूर्णांक क्षेत्रों के साथ की जगह सकता है) इसके अलावा मेरी समझ structs से के रूप में स्टैक पर बनाई गई हैं ढेर करने का विरोध करता है, तो इस struct जब फू कहा जाता है एक 1 एमबी बाइट सरणी क्षेत्र इतना
public int[] Mb = new int[262144];
उप-भाग 3. यह कभी ढेर से भी निकल जाते है के रूप में प्रारंभ करने के लिए कर रहे थे? मेरे लिए ऐसा लगता है क्योंकि संरचना कभी भी गुंजाइश से बाहर नहीं गई थी, इसे ढेर से हटाया नहीं जाएगा। टेस्ट केस बनाने के लिए आज रात नहीं है लेकिन शायद मैं कल इसके लिए करूँगा।
नीचे कोडTeaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
उप-भाग 4 में
। क्या टी 1 और टीप्लेस होल्डर एक ही या अलग पता स्थान पर कब्जा कर रहे हैं?
3 साल पुरानी पोस्ट लाने के लिए खेद है, लेकिन इसने मुझे वास्तव में अपना सिर खरोंच कर लिया है।
एफवाईआई स्टैक ओवरफ्लो पर पहला सवाल है, इसलिए अगर मुझे प्रश्न के साथ कुछ गलत मिला तो कृपया एक टिप्पणी पोस्ट करें और मैं संपादित करूंगा।
2 दिनों के बाद मैं इस प्रश्न पर 50 का इनाम दूंगा, भले ही मेरे पास मेरे दिमाग में एक विजेता चुना गया हो, क्योंकि मुझे लगता है कि उत्तर को प्रश्नों को समझाने के लिए उचित मात्रा में काम की आवश्यकता होगी।
1 में 4 प्रश्न स्टैक ओवरफ़्लो के लिए उपयुक्त नहीं हैं। एक प्रश्न * एक प्रश्न होना चाहिए। * –
@ एंथनीपेग्राम - इस मामले में मुझे लगता है कि यह प्रश्न मुख्य प्रश्न की ओर उपेक्षा हैं, इस तरह से structs वास्तव में काम करते हैं – Polity
मेरी माफ़ी नहीं है कि यह सब एक में कैसे पेश किया जाए। मुझे लगता है कि मुख्य प्रश्न यह है कि इस कीवर्ड को संशोधित करने की इजाजत देने के पक्ष में क्या प्रभाव पड़ता है? प्रश्न 3-4 साइड इफेक्ट्स हैं जिन्हें मैंने सोचा था कि एक संभावना हो सकती है। अगर किसी के पास मेरे अलावा प्रश्न संपादित करने की शक्ति है और सोचता है कि वे इसे बेहतर तरीके से पूछ सकते हैं तो कृपया ऐसा करने में संकोच न करें। या एक बेहतर सवाल का सुझाव देने वाली टिप्पणी छोड़ दो और मैं खरोंच से शुरू करूंगा। –