Αυτή η άσκηση πραγματεύεται μερικές λεπτομέρειες των παραμέτρων μεθόδου και τη χρήση τους στη 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() είναι εγγυημένο ότι δεν είναι null.
Υλοποίησε τη 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.
Η GetTelemetryData() θα πρέπει να επιστρέφει false αν το όρισμα serialNum είναι μικρότερο από την προηγούμενη τιμή που δέχτηκε. (Υπάρχει κάποιο ζήτημα με πολλαπλούς κόμβους τηλεμετρίας που εμπλέκονται). Σε αυτή την περίπτωση το 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.