C# में ref और out: शुरुआती लोगों की शीर्ष 5 गलतियाँ और उनसे कैसे बचें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# में ref और out: मॉडिफायर की लड़ाई जिसे आपको जीतना ही होगा

\n\n

यदि आपने कभी C# में ऐसा कोड लिखा है जिसमें एक नहीं बल्कि दो या तीन मान वापस करने की आवश्यकता थी, तो आप निश्चित रूप से ref और out कीवर्ड से परिचित हुए होंगे। पहली नज़र में ऐसा लगता है कि वे एक ही काम करते हैं - मेथड को पास किए गए वेरिएबल को बदलने की अनुमति देते हैं। लेकिन शैतान, हमेशा की तरह, विवरण में छिपा है। Stack Overflow पर प्रश्न "'ref' और 'out' कीवर्ड के बीच क्या अंतर है?" ने सैकड़ों हज़ारों बार देखा गया है। क्यों? क्योंकि उनके बीच भ्रम शुरुआती (और यहां तक कि अनुभवी डेवलपर्स के लिए भी, जब वे तेज़ी से कोड लिखते हैं) के लिए सबसे आम जाल में से एक है।

\n\n

इस लेख में, हम केवल शुष्क परिभाषाएँ सूचीबद्ध नहीं करेंगे। हम शीर्ष 5 वास्तविक गलतियों का विश्लेषण करेंगे जो प्रोग्रामर ref और out के साथ काम करते समय करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए। आप जानेंगे कि प्रत्येक मॉडिफायर का उपयोग कब करना है, और क्यों out सिर्फ "आलसी ref" नहीं है। चलिए शुरू करते हैं!

\n\n

मुख्य बात संक्षेप में: ref और out का दर्शन

\n\n

कल्पना करें कि आप एक मित्र को पार्सल भेज रहे हैं। ref तब होता है जब आप अपने मित्र को अपने अपार्टमेंट की चाबी देते हैं और कहते हैं: "मेरी चीज़ ले लो, तुम इसे बदल सकते हो, लेकिन वापस रख दो।" मित्र को आपसे चाबी अनिवार्य रूप से प्राप्त करनी होती है (कॉल करने से पहले वेरिएबल को इनिशियलाइज़ किया जाना चाहिए)।

\n\n

out तब होता है जब आप कहते हैं: "यह एक खाली डिब्बा है, इसे किसी चीज़ से भर दो और वापस कर दो।" आप मित्र को एक खाली कंटेनर देते हैं, और उसे इसे भरना अनिवार्य है। आपको पहले से उसमें अपनी कोई चीज़ डालने की आवश्यकता नहीं है।

\n\n

यह मुख्य अंतर है: ref के लिए आवश्यक है कि पास करने से पहले वेरिएबल को इनिशियलाइज़ किया जाए, जबकि out एक अनइनिशियलाइज़्ड वेरिएबल को पास करने की अनुमति देता है, लेकिन गारंटी देता है कि मेथड उसे एक मान निर्दिष्ट करेगा।

\n\n

गलती #1: इनिशियलाइज़ेशन में भ्रम

\n\n

सबसे आम विफलता। डेवलपर्स out में एक इनिशियलाइज़्ड वेरिएबल पास करने का प्रयास करते हैं - यह कोई गलती नहीं है, लेकिन अर्थ खो जाता है। या, इसके विपरीत, वे ref में एक अनइनिशियलाइज़्ड वेरिएबल पास करते हैं - और उन्हें कंपाइलेशन एरर मिलती है।

\n\n

कोड उदाहरण (गलती):

\n
public void Process(ref int x)\n{\n    x = x * 2;\n}\n\n// उपयोग\nint number; // गलती! वेरिएबल इनिशियलाइज़ नहीं है\nProcess(ref number); // CS0165: स्थानीय वेरिएबल "number" का उपयोग, जिसे कोई मान निर्दिष्ट नहीं किया गया है\n
\n\n

सही तरीका:

\n
int number = 10; // अनिवार्य रूप से इनिशियलाइज़ करें\nProcess(ref number);\nConsole.WriteLine(number); // 20\n
\n\n

out के साथ उदाहरण (सही):

\n
public void Initialize(out int value)\n{\n    value = 42; // मान निर्दिष्ट करना अनिवार्य है\n}\n\nint result; // इनिशियलाइज़ न करना संभव है!\nInitialize(out result);\nConsole.WriteLine(result); // 42\n
\n\n

निष्कर्ष: यदि आपको किसी मौजूदा मान को बदलना है - ref का उपयोग करें। यदि मेथड को "शून्य से" एक नया मान बनाना है - out का उपयोग करें।

\n\n

गलती #2: out-पैरामीटर में मान निर्दिष्ट करना भूल जाना

\n\n

C# कंपाइलर सख्त है: यदि आपने किसी पैरामीटर को out घोषित किया है, तो आपको मेथड से बाहर निकलने से पहले (कोड की सभी शाखाओं में) उसे एक मान निर्दिष्ट करना अनिवार्य है। यह कोई बग नहीं है, बल्कि एक विशेषता है जो आपको अपरिभाषित व्यवहार से बचाती है।

\n\n

कोड उदाहरण (गलती):

\n
public bool TryParse(string input, out int result)\n{\n    if (int.TryParse(input, out result))\n    {\n        return true;\n    }\n    // विफलता के मामले में result को मान निर्दिष्ट करना भूल गए!\n    // कंपाइलर एरर देगा: CS0177\n    return false;\n}\n
\n\n

सही तरीका:

\n
public bool TryParseSafe(string input, out int result)\n{\n    if (int.TryParse(input, out var parsed))\n    {\n        result = parsed;\n        return true;\n    }\n    result = 0; // हमेशा मान निर्दिष्ट करें\n    return false;\n}\n
\n\n

सलाह

ब्लॉग

पुस्तक अनुशंसाएँ