मैं समझता हूं कि यह एक कार्यान्वयन विस्तार है। मैं वास्तव में उत्सुक हूं कि माइक्रोसॉफ्ट के सीएलआर में है।माइक्रोसॉफ्ट के सीएलआर में एसिंक्रोनस विधि कॉल के लिए संग्रहीत रेफ वैल्यू टाइप पैरामीटर कहां हैं?
अब, मेरे साथ सहन मैं कॉलेज में सीएस का अध्ययन के रूप में नहीं था, इसलिए मैं कुछ मौलिक सिद्धांतों से चूक गए हो सकता है।
लेकिन "ढेर" और "ढेर" CLR में लागू के रूप में यह आज खड़ा है की मेरी समझ, ठोस है मुझे लगता है,। मैं कुछ गलत छतरी बयान नहीं दे रहा हूं जैसे कि "मूल्य प्रकार स्टैक पर संग्रहीत हैं," उदाहरण के लिए। लेकिन, सबसे आम परिदृश्यों में - सादे वेनिला स्थानीय चर, मान प्रकार के, या तो पैरामीटर के रूप में पारित कर दिया या घोषित विधि के भीतर और एक बंद अंदर निहित नहीं - मान प्रकार चर फिर ढेर (पर संग्रहीत, माइक्रोसॉफ्ट के CLR में हैं)।
मुझे लगता है कि मैं क्या है की अनिश्चित हूँ जहां ref
मूल्य प्रकार पैरामीटर में आते हैं
मूलतः क्या मैं सोच रहा था कि, कॉल स्टैक इस (बाएं = नीचे) की तरह लग रहा है, तो:।
A() -> B() -> C()
... तो एक स्थानीय चर एक के दायरे के भीतर घोषित कर दिया और एक ref
पैरामीटर करने के लिए बी अभी भी ढेर पर संग्रहीत किया जा सकता है के रूप में पारित - यह couldn't? बी बस स्मृति स्थान जहां कि स्थानीय चर एक की सीमा के भीतर जमा हो गया था की आवश्यकता होगी (मुझे माफ कर दो, तो यह सही शब्दावली नहीं है, मुझे लगता है कि यह स्पष्ट है कि मैं क्या मतलब है, वैसे भी)।
मैं, महसूस किया कि यह पूर्णतया सत्य नहीं हो सकता है हालांकि, जब यह मेरे लिए हुआ मैं यह कर सकता है कि:
delegate void RefAction<T>(ref T arg);
void A()
{
int x = 100;
RefAction<int> b = B;
// This is a non-blocking call; A will return immediately
// after this.
b.BeginInvoke(ref x, C, null);
}
void B(ref int arg)
{
// Putting a sleep here to ensure that A has exited by the time
// the next line gets executed.
Thread.Sleep(1000);
// Where is arg stored right now? The "x" variable
// from the "A" method should be out of scope... but its value
// must somehow be known here for this code to make any sense.
arg += 1;
}
void C(IAsyncResult result)
{
var asyncResult = (AsyncResult)result;
var action = (RefAction<int>)asyncResult.AsyncDelegate;
int output = 0;
// This variable originally came from A... but then
// A returned, it got updated by B, and now it's still here.
action.EndInvoke(ref output, result);
// ...and this prints "101" as expected (?).
Console.WriteLine(output);
}
इसलिए उपरोक्त उदाहरण में, जहां x
(में एक की है गुंजाइश) संग्रहित? और यह कैसे काम करता है? क्या यह बॉक्स किया गया है? यदि नहीं, तो क्या यह मूल्य प्रकार होने के बावजूद अब कचरा संग्रहण के अधीन है? या फिर स्मृति को तुरंत पुनः प्राप्त किया जा सकता है?
मैं लंबे समय से चलने वाले प्रश्न के लिए क्षमा चाहता हूं। लेकिन अगर जवाब काफी सरल है, तो शायद यह उन लोगों के लिए जानकारीपूर्ण होगा जो खुद को भविष्य में एक ही चीज़ सोचते हैं।
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx – Brian