व्यायाम - मूल्य और संदर्भ प्रकार के मापदंडों का उपयोग करें
सी # में, चर को दो मुख्य प्रकारों, मूल्य प्रकारों और संदर्भ प्रकारों में वर्गीकृत किया जा सकता है। ये प्रकार वर्णन करते हैं कि चर अपने मूल्यों को कैसे संग्रहीत करते हैं।
मान प्रकार जैसे int, bool, float, double, और char सीधे मान शामिल करते हैं. संदर्भ प्रकार जैसे string, array, और ऑब्जेक्ट्स (जैसे कि इंस्टेंस Random) उनके मानों को सीधे संग्रहीत नहीं करते हैं. इसके बजाय, संदर्भ प्रकार एक पता संग्रहीत करते हैं जहाँ उनका मान संग्रहीत किया जा रहा है.
पैरामीटर मूल्य द्वारा पारित और संदर्भ द्वारा पारित
जब किसी तर्क को किसी विधि में पास किया जाता है, तो मान प्रकार चर के मान विधि में कॉपी किए जाते हैं। प्रत्येक चर में मूल्य की अपनी प्रतिलिपि होती है, इसलिए मूल चर संशोधित नहीं होता है।
संदर्भ प्रकारों के साथ, मान का पता विधि में पारित किया जाता है। विधि को दिया गया चर उस पते पर मान का संदर्भ देता है, इसलिए उस चर पर संचालन उस मूल्य को प्रभावित करता है जिसे दूसरे द्वारा संदर्भित किया जाता है।
नोट
यह याद रखना महत्वपूर्ण है कि string यह एक संदर्भ प्रकार है, लेकिन यह अपरिवर्तनीय है। इसका मतलब है कि एक बार इसे एक मूल्य सौंपा गया है, इसे बदला नहीं जा सकता है। सी # में, जब किसी स्ट्रिंग को संशोधित करने के लिए विधियों और ऑपरेटरों का उपयोग किया जाता है, तो जो परिणाम दिया जाता है वह वास्तव में एक नया स्ट्रिंग ऑब्जेक्ट होता है।
इस अभ्यास में, आप संदर्भ और मूल्य प्रकार के तर्कों को विधियों में पारित करने के बारे में अधिक जानेंगे।
मूल्य द्वारा टेस्ट पास
Visual Studio कोड संपादक में, पिछले अभ्यासों से किसी भी मौजूदा कोड हटाएँ।
Visual Studio कोड संपादक में निम्न कोड दर्ज करें:
int a = 3; int b = 4; int c = 0; Multiply(a, b, c); Console.WriteLine($"global statement: {a} x {b} = {c}"); void Multiply(int a, int b, int c) { c = a * b; Console.WriteLine($"inside Multiply method: {a} x {b} = {c}"); }चर
a,b, औरcविधि कोMultiplyपारित कर रहे हैं। चर के मान विधि निष्पादन के दौरान मुद्रित होते हैं, और विधि पूर्ण होने के बाद फिर से मुद्रित होते हैं।पूर्णांक मूल्य प्रकार हैं, जिनके मूल्यों को विधियों में पारित होने पर कॉपी किया जाता है। आपको क्या लगता है कि उत्पादन
cक्या होगा?निम्न आउटपुट देखने के लिए अपना कोड सहेजें और चलाएँ:
inside Multiply method: 3 x 4 = 12 global statement: 3 x 4 = 0ध्यान दें कि का
cमान केवल विधि केMultiplyभीतर बदल दिया गया है। विधि के बाहर,cअपने मूल मूल्य को बरकरार रखता है।
संदर्भ द्वारा टेस्ट पास
Visual Studio कोड संपादक से पिछले कोड को हटाएँ।
Visual Studio कोड संपादक में निम्न कोड दर्ज करें:
int[] array = {1, 2, 3, 4, 5}; PrintArray(array); Clear(array); PrintArray(array); void PrintArray(int[] array) { foreach (int a in array) { Console.Write($"{a} "); } Console.WriteLine(); } void Clear(int[] array) { for (int i = 0; i < array.Length; i++) { array[i] = 0; } }कोड कुछ पूर्णांक मानों को शामिल करने के लिए प्रारंभ के साथ
arrayशुरू होता है। मान विधि का उपयोग करकेPrintArrayप्रदर्शित किए जाते हैं। विधि सरणीClearपर कहा जाता है, और उसके बाद सरणी फिर से मुद्रित किया जाता है।सरणियाँ संदर्भ प्रकार हैं। संदर्भ प्रकार स्मृति में उनके मूल्यों का पता संग्रहीत करते हैं। आपको क्या लगता है कि आउटपुट क्या होगा?
निम्न आउटपुट देखने के लिए अपना कोड सहेजें और चलाएँ:
1 2 3 4 5 0 0 0 0 0ध्यान दें कि सरणी विधि क्षेत्र के बाहर बदल जाती है
Clear। ऐसा इसलिए होता है क्योंकि विधि नेClearप्रत्येक पते पर संग्रहीत मानों को अपडेट किया है।
स्ट्रिंग्स के साथ टेस्ट करें
इससे पहले, आपने सीखा कि तार एक अपरिवर्तनीय प्रकार हैं। भले ही एक स्ट्रिंग एक संदर्भ प्रकार है, एक सरणी के विपरीत, इसके मूल्य को एक बार असाइन किए जाने के बाद नहीं बदला जा सकता है। आपने इस पर string.Replacestring.ToUpperध्यान दिया होगा यदि आपने या . इस कार्य में, आप स्ट्रिंग्स के साथ कार्य करते समय पाई गई एक सामान्य त्रुटि को ठीक करना सीखेंगे.
Visual Studio कोड संपादक में, पिछले अभ्यासों से किसी भी मौजूदा कोड हटाएँ।
Visual Studio कोड संपादक में निम्न कोड दर्ज करें:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(status, false); Console.WriteLine($"End: {status}"); void SetHealth(string status, bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }निम्न आउटपुट देखने के लिए अपना कोड सहेजें और चलाएँ:
Start: Healthy Middle: Unhealthy End: Healthyयदि विधि ने
SetHealthस्थिति को आउटपुट नहीं किया है, तो आप मान सकते हैं कि विधि सही तरीके से निष्पादित नहीं हुई है। इसके बजाय, मान "अस्वास्थ्यकर" के साथ एक नई स्ट्रिंग बनाई गई थी और फिर विधि क्षेत्र में खो गई थी।इस समस्या को ठीक करने के लिए, आप इसके बजाय वैश्विक स्थिति चर का उपयोग करने के लिए बदल
SetHealthसकते हैं।अपने कोड को निम्नानुसार अद्यतन करें:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(false); Console.WriteLine($"End: {status}"); void SetHealth(bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }इस कोड में, आप वैश्विक
statusचर को नए स्ट्रिंग मान के साथ अधिलेखित करते हैं।निम्न आउटपुट देखने के लिए अपना कोड सहेजें और चलाएँ:
Start: Healthy Middle: Unhealthy End: Unhealthyअब अद्यतन स्ट्रिंग कैप्चर की गई है और सही ढंग से संग्रहीत की गई है।
संक्षिप्त
यहां बताया गया है कि आपने मूल्य प्रकार और संदर्भ प्रकार पैरामीटर के बारे में अब तक क्या सीखा है:
- चर को मूल्य प्रकार और संदर्भ प्रकारों के रूप में वर्गीकृत किया जा सकता है।
- मान प्रकारों में सीधे मान होते हैं, और संदर्भ प्रकार मान के पते को संग्रहीत करते हैं.
- मान प्रकार तर्कों का उपयोग करने वाली विधियाँ मानों की अपनी प्रतिलिपि बनाती हैं.
- किसी सरणी पैरामीटर पर परिवर्तन करने वाली विधियाँ मूल इनपुट सरणी को प्रभावित करती हैं.
- स्ट्रिंग एक अपरिवर्तनीय संदर्भ प्रकार है।
- स्ट्रिंग पैरामीटर पर परिवर्तन करने वाली विधियाँ मूल स्ट्रिंग को प्रभावित नहीं करती हैं.