Questo esercizio tratterà alcuni dettagli dei parametri dei metodi e del loro utilizzo in C#.
I parametri trasmettono informazioni da un metodo chiamante a un metodo chiamato.
Il comportamento dei parametri può essere modificato dall'uso di modificatori come ref e out.
Un parametro con il modificatore out trasmette un valore dal metodo chiamato al chiamante. Il parametro può essere passato al metodo chiamato senza essere inizializzato e in ogni caso, all'interno del metodo chiamato, viene trattato come se all'ingresso non fosse stato inizializzato. Il modo più semplice per comprendere il comportamento e le regole dei modificatori dei parametri è attraverso esempi (vedi sotto) e messaggi del compilatore.
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
I parametri out devono ricevere un'assegnazione all'interno del metodo chiamato.
Un parametro con il modificatore ref passa un valore a un metodo chiamato. Quando il metodo restituisce, il chiamante troverà in quel parametro tutte le modifiche apportate dal metodo chiamato.
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref devono essere variabili, poiché il metodo chiamato opererà direttamente sul parametro così come è visto dal chiamante.out e ref sono richiesti sia nella firma del metodo chiamato sia nel punto di chiamata.Il progetto dell'auto radiocomandata che hai avviato nell'esercizio classes è andato bene (congratulazioni!) e, grazie a una serie di recenti accordi di sponsorizzazione, ci sono soldi nel budget per dei miglioramenti.
Parte del budget viene utilizzata per fornire un po' di telemetria.
Per tenere buoni gli sponsor, è stato installato un pannello sull'auto per mostrare i nomi degli sponsor mentre percorre la pista.
Noterai che l'introduzione di queste nuove tecnologie sofisticate ha ridotto drasticamente la durata della batteria dell'auto.
Implementa SetSponsors() in modo che accetti uno o più nomi di sponsor e li memorizzi sull'auto.
Nota che l'argomento del metodo SetSponsors() è garantito non nullo.
Implementa DisplaySponsor() per mostrare lo sponsor selezionato. Il primo sponsor passato ha un sponsorNum di 0, il secondo di 1 e così via.
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
Implementa il metodo RemoteControlCar.GetTelemetryData().
GetTelemetryData() deve rendere disponibili, tramite parametri out, la percentuale della batteria e la distanza percorsa in metri.
GetTelemetryData() deve restituire false se l'argomento serialNum è minore del valore ricevuto in precedenza. (C'è qualche problema con il coinvolgimento di più nodi di telemetria). In questo caso serialNum verrà impostato al valore più alto tra i serialNum precedenti e sia la percentuale della batteria sia i metri percorsi verranno impostati a -1. Se la chiamata ha successo, serialNum rimane invariato.
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
Implementa il metodo TelemetryClient.GetBatteryUsagePerMeter().
Questo chiamerà RemoteControlCar.GetTelemetryData(). Se GetTelemetryData() restituisce false o l'auto non è stata guidata, allora questa routine dovrebbe restituire "no data". Se GetTelemetryData() restituisce true, allora dovrebbe essere restituito un messaggio nella forma seguente: "usage-per-meter=BATTERY-USAGE-PER-METER". Dove il calcolo è (100 - percentuale attuale della batteria) diviso per la distanza percorsa finora in metri.
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"
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.