In dieser Übung geht es um einige Details von Methodenparametern und ihrer Verwendung in C#.
Parameter übermitteln Informationen von einer aufrufenden Methode an eine aufgerufene Methode.
Das Verhalten von Parametern lässt sich durch Modifizierer wie ref und out ändern.
Ein Parameter mit dem out-Modifizierer übermittelt einen Wert von der aufgerufenen Methode zurück an den Aufrufer. Der Parameter kann an die aufgerufene Methode übergeben werden, ohne initialisiert zu sein, und wird in der aufgerufenen Methode in jedem Fall so behandelt, als wäre er beim Eintritt nicht initialisiert gewesen. Wie Parameter-Modifizierer sich verhalten und welche Regeln dafür gelten, verstehst du am einfachsten anhand von Beispielen (siehe unten) und Compilermeldungen.
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-Parameter müssen innerhalb einer aufgerufenen Methode zugewiesen werden.
Ein Parameter mit dem ref-Modifizierer übergibt einen Wert an eine aufgerufene Methode. Wenn die Methode zurückkehrt, findet der Aufrufer in diesem Parameter alle Aktualisierungen, die die aufgerufene Methode vorgenommen hat.
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref-Parameter müssen Variablen sein, da die aufgerufene Methode direkt mit dem Parameter arbeitet, wie der Aufrufer ihn sieht.out und ref sind sowohl in der Signatur der aufgerufenen Methode als auch an der Aufrufstelle erforderlich.Das Projekt mit dem ferngesteuerten Auto, das du in der Übung classes gestartet hast, ist gut gelaufen (Herzlichen Glückwunsch!), und aufgrund einer Reihe neuer Sponsorenverträge ist Geld für Verbesserungen im Budget.
Ein Teil des Budgets wird für Telemetrie verwendet.
Um die Sponsoren bei Laune zu halten, wurde eine Anzeigetafel am Auto installiert, die die Namen der Sponsoren anzeigt, während es über die Strecke fährt.
Du wirst feststellen, dass die Einführung dieser schicken neuen Technologien die Akkulaufzeit des Autos drastisch verkürzt hat.
Implementiere SetSponsors(), um einen oder mehrere Sponsorennamen entgegenzunehmen und sie im Auto zu speichern.
Beachte, dass das Argument der Methode SetSponsors() garantiert nicht null ist.
Implementiere DisplaySponsor(), um den ausgewählten Sponsor anzuzeigen. Der erste übergebene Sponsor hat eine sponsorNum von 0, der zweite 1 usw.
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
Implementiere die Methode RemoteControlCar.GetTelemetryData().
GetTelemetryData() soll den Akkustand in Prozent und die gefahrene Strecke in Metern über out-Parameter verfügbar machen.
GetTelemetryData() soll false zurückgeben, wenn das Argument serialNum kleiner ist als der zuvor empfangene Wert. (Es gibt da ein Problem mit mehreren beteiligten Telemetrieknoten.) In diesem Fall wird serialNum auf den höchsten vorherigen serialNum gesetzt und sowohl der Akkustand als auch die gefahrenen Meter werden auf -1 gesetzt. Wenn der Aufruf erfolgreich ist, bleibt serialNum unverändert.
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
Implementiere die Methode TelemetryClient.GetBatteryUsagePerMeter().
Dies ruft RemoteControlCar.GetTelemetryData() auf. Wenn GetTelemetryData() false zurückgibt oder das Auto nicht gefahren wurde, dann sollte diese Routine „no data“ zurückgeben. Wenn GetTelemetryData() true zurückgibt, dann sollte eine Nachricht in der folgenden Form zurückgegeben werden: „usage-per-meter=BATTERY-USAGE-PER-METER“. Die Berechnung ist dabei (100 - aktueller Akkustand in Prozent) geteilt durch die bisher gefahrene Strecke in Metern.
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"
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.