Este exercício discute alguns detalhes dos parâmetros de métodos e seu uso em C#.
Os parâmetros transmitem informações de um método chamador para um método chamado.
O comportamento dos parâmetros pode ser modificado pelo uso de modificadores como ref e out.
Um parâmetro com o modificador out transmite um valor de volta do método chamado para o chamador. O parâmetro pode ser passado ao método chamado sem ser inicializado e, de qualquer forma, é tratado dentro do método chamado como se, na entrada, não tivesse sido inicializado. A compreensão do comportamento e das regras sobre modificadores de parâmetros pode ser obtida mais facilmente por meio de exemplos (veja abaixo) e 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 precisam ser atribuídos dentro do método chamado.
Um parâmetro com o modificador ref passa um valor para dentro do método chamado. Quando o método retorna, o chamador encontrará nesse parâmetro quaisquer atualizações feitas pelo método chamado.
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref precisam ser variáveis, pois o método chamado operará diretamente sobre o parâmetro como visto pelo chamador.out e ref são exigidos tanto na assinatura do método chamado quanto no local da chamada.O projeto do carrinho de controle remoto que você iniciou no exercício classes deu certo (parabéns!) e, graças a vários acordos de patrocínio recentes, há verba no orçamento para melhorias.
Parte do orçamento está sendo usada para fornecer um pouco de telemetria.
Para agradar os patrocinadores, foi instalado no carrinho um painel que exibe os nomes dos patrocinadores enquanto ele dá voltas na pista.
Você vai notar que a introdução dessas novas tecnologias sofisticadas reduziu drasticamente a duração da bateria do carrinho.
Implemente SetSponsors() para receber um ou mais nomes de patrocinadores e armazená-los no carrinho.
Repare que o argumento do método SetSponsors() é garantidamente não nulo.
Implemente DisplaySponsor() para exibir o patrocinador selecionado. O primeiro patrocinador passado 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"
Implemente o método RemoteControlCar.GetTelemetryData().
GetTelemetryData() deve disponibilizar a porcentagem da bateria e a distância percorrida em metros por meio de parâmetros out.
GetTelemetryData() deve retornar false se o argumento serialNum for menor que o valor recebido anteriormente. (Há algum problema envolvendo múltiplos nós de telemetria). Nesse caso, serialNum será definido como o maior serialNum anterior, e tanto a porcentagem da bateria quanto os metros percorridos serão definidos como -1. Quando a chamada é bem-sucedida, serialNum permanece 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
Implemente o método TelemetryClient.GetBatteryUsagePerMeter().
Ele vai chamar RemoteControlCar.GetTelemetryData(). Se GetTelemetryData() retornar false ou o carrinho não tiver sido dirigido, essa rotina deve retornar "no data". Se GetTelemetryData() retornar true, deve ser retornada uma mensagem no seguinte formato: "usage-per-meter=BATTERY-USAGE-PER-METER". Em que o cálculo é (100 - porcentagem atual da bateria) dividido pela distância percorrida em metros até agora.
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"
Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.