यह अभ्यास मेथड पैरामीटर की कुछ बारीकियों और C# में उनके उपयोग पर चर्चा करता है।
पैरामीटर कॉल करने वाले मेथड से कॉल किए गए मेथड तक जानकारी पहुँचाते हैं।
ref और out जैसे मॉडिफायर इस्तेमाल करके पैरामीटर का व्यवहार बदला जा सकता है।
out मॉडिफायर वाला पैरामीटर कॉल किए गए मेथड से वापस कॉल करने वाले तक एक वैल्यू पहुँचाता है। इस पैरामीटर को बिना शुरुआती वैल्यू दिए ही कॉल किए गए मेथड को भेजा जा सकता है, और किसी भी हालत में कॉल किए गए मेथड के अंदर इसे ऐसे माना जाता है जैसे मेथड में प्रवेश करते समय इसे कोई वैल्यू मिली ही न हो। पैरामीटर मॉडिफायर से जुड़े व्यवहार और नियमों को समझने का सबसे आसान तरीका उदाहरण (नीचे देखिए) और कंपाइलर के संदेश हैं।
void Foo(out int val)
{
val = 42;
}
void Bar(int val)
{
val = 42;
}
int importantValue = 1729;
Foo(out importantValue);
var result = importantValue == 42;
// => true
importantValue = 1729;
Bar(importantValue);
result = importantValue == 1729;
// => true
out पैरामीटर को कॉल किए गए मेथड के अंदर ही असाइन करना ज़रूरी है।
ref मॉडिफायर वाला पैरामीटर कॉल किए गए मेथड के अंदर एक वैल्यू भेजता है। मेथड के लौटने पर कॉल करने वाले को उस पैरामीटर में वे सारे बदलाव दिखेंगे जो कॉल किए गए मेथड ने किए थे।
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref पैरामीटर वेरिएबल ही होने चाहिए, क्योंकि कॉल किया गया मेथड सीधे उसी पैरामीटर पर काम करता है जो कॉल करने वाले को दिखता है।out और ref मॉडिफायर दोनों जगह ज़रूरी हैं: कॉल किए गए मेथड के सिग्नेचर में भी, और जहाँ मेथड को कॉल किया जा रहा है वहाँ भी।classes अभ्यास में आपने जो रिमोट कंट्रोल कार प्रोजेक्ट शुरू किया था, वह अच्छा चला (बधाई हो!), और हाल के कई स्पॉन्सरशिप सौदों की वजह से बजट में सुधार के लिए पैसे आ गए हैं।
बजट का एक हिस्सा कुछ टेलीमेट्री उपलब्ध कराने में लगाया जा रहा है।
स्पॉन्सरों को खुश रखने के लिए कार पर एक पैनल लगाया गया है, जो कार के ट्रैक पर चक्कर लगाते समय स्पॉन्सरों के नाम प्रदर्शित करता है।
आप देखेंगे कि इन नई फैंसी तकनीकों की शुरुआत से कार की बैटरी लाइफ बहुत कम हो गई है।
SetSponsors() को इस तरह लागू कीजिए कि यह एक या अधिक स्पॉन्सरों के नाम ले और उन्हें कार पर संग्रहीत करे।
ध्यान रखें कि SetSponsors() मेथड का आर्गुमेंट नॉन-नल होना निश्चित है।
DisplaySponsor() को लागू कीजिए ताकि यह चुने गए स्पॉन्सर को प्रदर्शित करे। पहले पास किए गए स्पॉन्सर का sponsorNum 0 होता है, दूसरे का 1, और इसी तरह आगे।
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
RemoteControlCar.GetTelemetryData() मेथड को लागू कीजिए।
GetTelemetryData() को बैटरी प्रतिशत और मीटरों में तय की गई दूरी out पैरामीटरों के ज़रिए उपलब्ध करना चाहिए।
यदि serialNum आर्गुमेंट पहले प्राप्त वैल्यू से कम है, तो GetTelemetryData() को false लौटाना चाहिए। (कई टेलीमेट्री नोड्स शामिल होने की कोई समस्या रहती है)। ऐसी स्थिति में serialNum को पिछले सबसे बड़े serialNum पर सेट किया जाएगा, और बैटरी प्रतिशत तथा तय किए गए मीटर दोनों -1 पर सेट हो जाएँगे। जहाँ कॉल सफल होती है, वहाँ serialNum अपरिवर्तित रहता है।
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
int serialNum = 4;
car.GetTelemetryData(ref serialNum, out int batteryPercentage, out int distanceDrivenInMeters);
// => true, 4L, 80, 4
serialNum = 1;
car.GetTelemetryData(ref serialNum, out batteryPercentage, out distanceDrivenInMeters);
// => false, 4L, -1, -1
TelemetryClient.GetBatteryUsagePerMeter() मेथड को लागू कीजिए।
यह RemoteControlCar.GetTelemetryData() को कॉल करेगा। यदि GetTelemetryData() false लौटाता है या कार चलाई नहीं गई है, तो इस रूटीन को "no data" लौटाना चाहिए। यदि GetTelemetryData() true लौटाता है, तो निम्न रूप में एक संदेश लौटाया जाना चाहिए: "usage-per-meter=BATTERY-USAGE-PER-METER"। यहाँ गणना यह है: (100 में से वर्तमान बैटरी प्रतिशत घटाकर) को अब तक तय की गई मीटरों में दूरी से भाग देना।
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
var tc = new TelemetryClient(car);
int serialNum = 4;
tc.GetBatteryUsagePerMeter(serialNum);
// => "usage-per-meter=5"
serialNum = 1;
tc.GetBatteryUsagePerMeter(serialNum);
// => "no data"
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।