यह प्रश्न 23 जून 2011 को मेरे ब्लॉग का विषय था । महान प्रश्न के लिए धन्यवाद!
C # टीम C # 7 के लिए इस पर विचार कर रही है । विवरण के लिए https://github.com/dotnet/roslyn/issues/5233 देखें।
अद्यतन: सुविधा ने इसे C # 7 में बनाया है!
तुम सही हो; .NET ऐसे तरीकों का समर्थन करता है जो चर के लिए प्रबंधित संदर्भ लौटाते हैं । .NET स्थानीय चर का भी समर्थन करता है जिसमें अन्य चर के लिए प्रबंधित संदर्भ होते हैं। (ध्यान दें कि .NET उन फ़ील्ड्स या सरणियों का समर्थन नहीं करता है जिनमें अन्य चर के लिए प्रबंधित संदर्भ शामिल हैं क्योंकि यह कचरा संग्रह कहानी को जटिल बनाता है। "प्रबंधित संदर्भ चर" प्रकार भी ऑब्जेक्ट के लिए परिवर्तनीय नहीं हैं , और इसलिए इसका उपयोग नहीं किया जा सकता है। जेनेरिक प्रकार या विधियों के लिए तर्क टाइप करें।)
टिप्पणीकार "RPM1984" ने किसी कारण से इस तथ्य के लिए प्रशस्ति पत्र मांगा। RPM1984 मैं आपको .NET की इस सुविधा के बारे में जानकारी के लिए CLI विनिर्देश विभाजन I खंड 8.2.1.1, "प्रबंधित संकेत और संबंधित प्रकार" पढ़ने के लिए प्रोत्साहित करता हूं।
सी # का एक संस्करण बनाना पूरी तरह से संभव है जो इन दोनों विशेषताओं का समर्थन करता है। आप तब जैसी चीजें कर सकते थे
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
और फिर इसके साथ कॉल करें
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!
मैं अनुभवजन्य रूप से जानता हूं कि C # का एक संस्करण बनाना संभव है जो इन विशेषताओं का समर्थन करता है क्योंकि मैंने ऐसा किया है । उन्नत प्रोग्रामर, विशेष रूप से अप्रबंधित सी ++ कोड को पोर्ट करने वाले लोग, अक्सर हमसे अधिक सी ++ के लिए पूछते हैं - जैसे कि संदर्भ के साथ चीजों को करने की क्षमता, वास्तव में पॉइंटर्स का उपयोग करके और सभी जगह मेमोरी को पिन करने के बिना। प्रबंधित संदर्भों का उपयोग करके आप अपने कचरा संग्रहण प्रदर्शन को खराब करने की लागत का भुगतान किए बिना ये लाभ प्राप्त करते हैं।
हमने इस सुविधा पर विचार किया है, और अपनी प्रतिक्रिया प्राप्त करने के लिए अन्य आंतरिक टीमों को दिखाने के लिए वास्तव में इसे पर्याप्त रूप से लागू किया है। हालाँकि इस समय हमारे शोध के आधार पर हमारा मानना है कि इस सुविधा में व्यापक रूप से पर्याप्त अपील या सम्मोहक उपयोग के मामले नहीं हैं, जो इसे वास्तविक जीवन सुविधा में बनाते हैं । हमारे पास अन्य उच्च प्राथमिकताएं और सीमित समय और प्रयास उपलब्ध हैं, इसलिए हम जल्द ही इस सुविधा को करने नहीं जा रहे हैं।
इसके अलावा, इसे ठीक से करने से सीएलआर में कुछ बदलाव करने की आवश्यकता होगी। अभी सीएलआर री-रिटर्निंग विधियों को कानूनी लेकिन असाध्य मानते हैं क्योंकि हमारे पास एक डिटेक्टर नहीं है जो इस स्थिति का पता लगाता है:
ref int M1(ref int x)
{
return ref x;
}
ref int M2()
{
int y = 123;
return ref M1(ref y); // Trouble!
}
int M3()
{
ref int z = ref M2();
return z;
}
एम 3 एम 2 के स्थानीय चर की सामग्री लौटाता है, लेकिन उस चर का जीवनकाल समाप्त हो गया है! एक डिटेक्टर लिखना संभव है जो रिफ-रिटर्न के उपयोग को निर्धारित करता है जो स्पष्ट रूप से स्टैक सुरक्षा का उल्लंघन नहीं करता है। हम क्या करेंगे इस तरह के डिटेक्टर को लिखें, और यदि डिटेक्टर स्टैक सुरक्षा को साबित नहीं कर सकता है, तो हम प्रोग्राम के उस हिस्से में रेफ रिटर्न के उपयोग की अनुमति नहीं देंगे। यह करने के लिए देव कार्य की एक बड़ी राशि नहीं है, लेकिन यह सुनिश्चित करने के लिए परीक्षण टीमों पर बहुत अधिक बोझ है कि हमें वास्तव में सभी मामले मिल गए हैं। यह सिर्फ एक और बात है जो सुविधा की लागत को उस बिंदु तक बढ़ाती है जहां अभी लाभ लागत से अधिक नहीं है।
यदि आप मेरे लिए वर्णन कर सकते हैं कि आप यह सुविधा क्यों चाहते हैं, तो मैं वास्तव में इसकी सराहना करूंगा । हमारे पास वास्तविक ग्राहकों से अधिक जानकारी है कि वे इसे क्यों चाहते हैं, अधिक संभावना है कि यह किसी दिन उत्पाद में कर देगा। यह एक प्यारा सा फीचर है और मैं चाहूंगा कि अगर इसमें पर्याप्त रुचि हो तो किसी तरह इसे ग्राहकों तक पहुंचा पाऊं।
(संबंधित प्रश्न भी देखें क्या C # में चर के संदर्भ को वापस करना संभव है? और क्या मैं C # फ़ंक्शन जैसे C ++ के अंदर संदर्भ का उपयोग कर सकता हूं? )