Este exercício aborda alguns detalhes dos parâmetros dos métodos e da sua utilização em C#.
Os parâmetros transportam informação de um método que chama para um método chamado.
O comportamento dos parâmetros pode ser modificado com o recurso a modificadores como ref e out.
Um parâmetro com o modificador out transmite um valor de volta do método chamado para quem o chama. O parâmetro pode ser passado ao método chamado sem estar inicializado e, em qualquer caso, é tratado dentro do método chamado como se, à entrada, não tivesse sido inicializado. A forma mais fácil de compreender o comportamento e as regras relativas aos modificadores de parâmetros é através de exemplos (ver abaixo) e de mensagens do compilador.
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
Os parâmetros out têm de receber uma atribuição dentro do método chamado.
Um parâmetro com o modificador ref passa um valor para um método chamado. Quando o método termina, quem o chama encontra nesse parâmetro todas as atualizações feitas pelo método chamado.
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref têm de ser variáveis, pois o método chamado vai operar diretamente sobre o parâmetro tal como é visto por quem o chama.out e ref são obrigatórios tanto na assinatura do método chamado como no local da chamada.O projeto do carro de controlo remoto que iniciastе no exercício classes correu bem (parabéns!) e, devido a vários acordos de patrocínio recentes, há dinheiro no orçamento para melhorias.
Parte do orçamento está a ser usada para fornecer alguma telemetria.
Para manter os patrocinadores contentes, foi instalado no carro um painel que mostra os nomes dos patrocinadores enquanto este percorre a pista.
Vais notar que a introdução destas novas tecnologias sofisticadas reduziu drasticamente a duração da bateria do carro.
Implementa SetSponsors() para receber um ou mais nomes de patrocinadores e guardá-los no carro.
Repara que o argumento do método SetSponsors() é garantidamente não nulo.
Implementa DisplaySponsor() para mostrar o patrocinador selecionado. O primeiro patrocinador indicado tem sponsorNum 0, o segundo, 1, e assim por diante.
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
Implementa o método RemoteControlCar.GetTelemetryData().
GetTelemetryData() deve disponibilizar a percentagem de bateria e a distância percorrida em metros através de parâmetros out.
GetTelemetryData() deve devolver false se o argumento serialNum for menor do que o valor recebido anteriormente. (Há aqui alguma questão relacionada com o envolvimento de vários nós de telemetria.) Neste caso, serialNum será definido com o valor mais alto de serialNum anterior e tanto a percentagem de bateria como os metros percorridos serão definidos como -1. Quando a chamada tem sucesso, serialNum mantém-se inalterado.
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 o método TelemetryClient.GetBatteryUsagePerMeter().
Este método vai chamar RemoteControlCar.GetTelemetryData(). Se GetTelemetryData() devolver false ou o carro não tiver sido conduzido, esta rotina deve devolver "no data". Se GetTelemetryData() devolver true, deve ser devolvida uma mensagem com o seguinte formato "usage-per-meter=BATTERY-USAGE-PER-METER". Em que o cálculo é (100 - percentagem de bateria atual) a dividir pela distância percorrida em metros até ao momento.
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"
Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.