दिलचस्प पोस्ट
जावा में विभिन्न प्रकार के थ्रेड-सुरक्षित सेट्स जावा में घोषणा "डबल-चेक लॉकिंग टूटी हुई" घोषित करने के लिए कैसे करें? बुनियादी एथ पॉपअप को आमंत्रित करने के लिए ब्राउजर को कैसे रोकें और 401 त्रुटि जेक्जरी का उपयोग कर? एकाधिक, अनुक्रमिक लाने () वादा आईओएस – अलग आकार के दो चित्रों को मिलाकर बाश के साथ फ़ंक्शन तर्क के रूप में रिक्त स्थान के साथ स्ट्रिंग पास करना क्रोम: वेब तत्वों का स्वचालित बदलाव निर्भरता वृक्ष को खोजने के लिए gradle का उपयोग करना एंड्रॉइड कूड़ा कलेक्टर के तकनीकी विवरण asp.net-mvc: रेजर '@' प्रतीक जेएस फ़ाइल में PHP में स्ट्रिंग के रूप में एक चर नाम कैसे प्राप्त करें? पायथन: समूह का उपयोग करके समूह में सबसे अधिक मूल्य वाली पंक्ति प्राप्त करना jquery का उपयोग कर एक वेबसाइट का एक स्क्रीनशॉट उत्पन्न करना MySQL ENUM प्रकार बनाम मेजबान पाठ ब्लिंकिंग jQuery

क्यों सी # संदर्भों की वापसी का समर्थन नहीं करता है?

मैंने पढ़ा है कि .NET संदर्भों की वापसी का समर्थन करता है, लेकिन सी # नहीं करता है क्या कोई विशेष कारण है? मैं ऐसा क्यों नहीं कर सकता:

static ref int Max(ref int x, ref int y) { if (x > y) return ref x; else return ref y; } 

वेब के समाधान से एकत्रित समाधान "क्यों सी # संदर्भों की वापसी का समर्थन नहीं करता है?"

यह प्रश्न मेरे ब्लॉग का विषय जून 23, 2011 को था महान प्रश्न के लिए धन्यवाद!

सी # टीम सी # 7 के लिए इस पर विचार कर रही है। विवरण के लिए https://github.com/dotnet/roslyn/issues/5233 देखें।

अद्यतनः सुविधा ने इसे सी # 7 में बनाया है!


तुम सही हो; .NET समर्थन विधियों को चर के लिए प्रबंधित संदर्भों को वापस लौटाता है । .NET स्थानीय वेरिएबल का भी समर्थन करता है जिसमें अन्य चर के प्रबंधित संदर्भ होते हैं। (हालांकि ध्यान दें कि .NET फ़ील्ड या एरेज़ का समर्थन नहीं करता है जिसमें अन्य वैरिएबल के प्रबंधित संदर्भ होते हैं, क्योंकि कचरा संग्रह की कहानी को बहुत अधिक जटिल बनाता है। इसके अलावा "वेरिएबल के लिए प्रबंधित संदर्भ" ऑब्जेक्ट के लिए परिवर्तनीय नहीं हैं, और इसलिए इसका उपयोग नहीं किया जा सकता है सामान्य प्रकार या विधियों के लिए तर्क लिखें।)

टिप्पणीकार "RPM1984" किसी कारण के लिए इस तथ्य के लिए एक उद्धरण के लिए पूछा RPM1984 मैं आपको सीआईआई विनिर्देश पढ़ने के लिए प्रोत्साहित करता हूं विभाजन I अनुभाग 8.2.1.1, "प्रबंधित पॉइंटर्स और संबंधित प्रकार" .NET के इस सुविधा के बारे में जानकारी के लिए।

सी # का एक संस्करण बनाने के लिए पूरी तरह से संभव है, जो इन दोनों सुविधाओं का समर्थन करता है। फिर आप चीजों की तरह कर सकते हैं

 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 ++ जैसी किसी सी # फ़ंक्शन के अंदर एक संदर्भ का उपयोग कर सकता हूं? )

आप उन विधियों के बारे में बात कर रहे हैं जो मान प्रकार के संदर्भ लौटाते हैं। सी # में बनाया गया एकमात्र उदाहरण जो मुझे पता है कि मूल्य प्रकार के सरणी-प्रवेशक है:

 public struct Point { public int X { get; set; } public int Y { get; set; } } 

और अब उस संरचना की एक सरणी बनाएं:

 var points = new Point[10]; points[0].X = 1; points[0].Y = 2; 

इस मामले में points[0] , सरणी अनुक्रमणिका , संरचना के संदर्भ को वापस कर रहा है। अपने खुद के सूचक को लिखना असंभव है (उदाहरण के लिए एक कस्टम संग्रह के लिए), जो कि वही है "एक संदर्भ वापस" व्यवहार

मैंने सी # भाषा को डिज़ाइन नहीं किया है इसलिए मुझे इसका समर्थन नहीं करने के पीछे सभी तर्क पता है, लेकिन मुझे लगता है कि इसका छोटा उत्तर हो सकता है: हम इसे बिना ठीक इसके साथ मिल सकते हैं।

आप हमेशा ऐसा कुछ कर सकते हैं:

 public delegate void MyByRefConsumer<T>(ref T val); public void DoSomethingWithValueType(MyByRefConsumer<int> c) { int x = 2; c(ref x); //Handle potentially changed x... } 

सी # 7.0 वापस संदर्भ के लिए समर्थन है। मेरा जवाब यहां देखें