Cet exercice aborde quelques détails des paramètres de méthode et de leur utilisation en C#.
Les paramètres transmettent des informations d'une méthode appelante à une méthode appelée.
Le comportement des paramètres peut être modifié par l'utilisation de modificateurs tels que ref et out.
Un paramètre avec le modificateur out transmet une valeur de la méthode appelée vers l'appelant. Ce paramètre peut être passé à la méthode appelée sans être initialisé et, de toute façon, dans la méthode appelée, il est traité comme s'il n'avait pas été initialisé à l'entrée. On comprend plus facilement le comportement et les règles concernant les modificateurs de paramètres à l'aide d'exemples (voir ci-dessous) et des messages du compilateur.
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
Les paramètres out doivent être affectés dans une méthode appelée.
Un paramètre avec le modificateur ref transmet une valeur à une méthode appelée. Lorsque la méthode se termine, l'appelant retrouve dans ce paramètre toutes les modifications effectuées par la méthode appelée.
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref doivent être des variables, car la méthode appelée agit directement sur le paramètre tel que le voit l'appelant.out et ref sont obligatoires à la fois dans la signature de la méthode appelée et au niveau du site d'appel.Le projet de voiture télécommandée que tu as lancé dans l'exercice classes a bien avancé (félicitations !) et, grâce à plusieurs contrats de sponsoring récents, le budget contient de quoi financer quelques améliorations.
Une partie du budget sert à mettre en place de la télémétrie.
Pour ménager les sponsors, un panneau a été installé sur la voiture afin d'afficher les noms des sponsors pendant qu'elle parcourt la piste.
Tu noteras que l'arrivée de ces nouvelles technologies sophistiquées a considérablement réduit l'autonomie de la batterie de la voiture.
Implémente SetSponsors() afin qu'elle prenne un ou plusieurs noms de sponsors et les stocke sur la voiture.
Note que l'argument de la méthode SetSponsors() est garanti non nul.
Implémente DisplaySponsor() pour afficher le sponsor sélectionné. Le premier sponsor passé en argument a pour sponsorNum 0, le deuxième 1, etc.
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
Implémente la méthode RemoteControlCar.GetTelemetryData().
GetTelemetryData() doit exposer le pourcentage de batterie et la distance parcourue en mètres via des paramètres out.
GetTelemetryData() doit renvoyer false si l'argument serialNum est inférieur à la valeur reçue précédemment. (Il y a un problème lié à la présence de plusieurs nœuds de télémétrie.) Dans ce cas, serialNum prendra la valeur du plus grand serialNum précédent, et le pourcentage de batterie comme les mètres parcourus seront tous deux mis à -1. Lorsque l'appel réussit, serialNum reste inchangé.
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
Implémente la méthode TelemetryClient.GetBatteryUsagePerMeter().
Cette méthode appellera RemoteControlCar.GetTelemetryData(). Si GetTelemetryData() renvoie false ou que la voiture n'a pas roulé, cette routine doit renvoyer « no data ». Si GetTelemetryData() renvoie true, elle doit renvoyer un message de la forme « usage-per-meter=BATTERY-USAGE-PER-METER ». Le calcul effectué est (100 - pourcentage de batterie actuel) divisé par la distance parcourue en mètres jusqu'ici.
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"
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.