Exercício - Retorno de valores e parâmetros de métodos
- 18 minutos
Na unidade anterior, você usou um cenário de codificação "roll dice" para ilustrar a diferença entre métodos stateful (instância) e stateless (estático). Esse mesmo cenário pode ajudá-lo a entender outros conceitos importantes sobre métodos de chamada. Por exemplo:
- manipulando o valor de retorno de um método.
- parâmetros de método e passagem de argumentos para um método.
- escolher uma versão sobrecarregada de um método.
Valores de retorno
Alguns métodos são concebidos para concluírem as suas funções e terminarem "silenciosamente". Em outras palavras, eles não retornam um valor quando terminam. São denominados métodos vazios.
Outros métodos são projetados para retornar um valor após a conclusão. O valor de retorno é normalmente o resultado de uma operação. Um valor de retorno é a principal maneira de um método se comunicar de volta ao código que chama o método.
Você viu que o Random.Next() método retorna um int tipo que contém o valor do número gerado aleatoriamente. No entanto, um método pode ser projetado para retornar qualquer tipo de dados, até mesmo outra classe. Por exemplo, a String classe tem alguns métodos que retornam uma cadeia de caracteres, alguns que retornam um inteiro e alguns que retornam um booleano.
Ao chamar um método que retorna um valor, você geralmente atribuirá o valor de retorno a uma variável. Dessa forma, você pode usar o valor posteriormente em seu código. No cenário de dados, você atribuiu o valor de retorno de Random.Next() à roll variável:
int roll = dice.Next(1, 7);
Em alguns casos, talvez você queira usar o valor de retorno diretamente, sem atribuí-lo a uma variável. Por exemplo, talvez você queira imprimir o valor de retorno para o console da seguinte maneira:
Console.WriteLine(dice.Next(1, 7));
Mesmo que um método retorne um valor, é possível chamar o método sem usar o valor de retorno. Por exemplo, você pode ignorar o valor de retorno chamando o método da seguinte maneira:
dice.Next(1, 7);
No entanto, ignorar o valor de retorno seria inútil. A razão pela qual você está chamando o Next() método é para que você possa recuperar o próximo valor aleatório.
Parâmetros de método e argumentos na instrução de chamada
Quando você chama um método, você pode passar valores que o método usará para concluir sua tarefa. Esses valores são chamados de argumentos. O método usa os argumentos para atribuir valores aos parâmetros que são definidos na assinatura do método. Um método pode exigir um ou mais parâmetros para realizar sua tarefa, ou nenhum.
Observação
Muitas vezes, os termos "parâmetro" e "argumento" são usados indistintamente. No entanto, 'parâmetro' refere-se à variável que está sendo usada dentro do método. Um 'argumento' é o valor que é passado quando o método é chamado.
A maioria dos métodos são projetados para aceitar um ou mais parâmetros. Os parâmetros podem ser usados para configurar como o método executa seu trabalho, ou eles podem ser operados diretamente. Por exemplo, o Random.Next() método usa parâmetros para configurar os limites superior e inferior do valor de retorno. No entanto, o Console.WriteLine() usa o parâmetro diretamente, imprimindo o valor para o console.
Os métodos usam uma assinatura de método para definir o número de parâmetros que o método aceitará, bem como o tipo de dados de cada parâmetro. A instrução de codificação que chama o método deve aderir aos requisitos especificados pela assinatura do método. Alguns métodos fornecem opções para o número e tipo de parâmetros que o método aceita.
Quando um chamador invoca o método, ele fornece valores concretos, chamados argumentos, para cada parâmetro. Os argumentos devem ser compatíveis com o tipo de parâmetro. No entanto, o nome do argumento, se for usado no código de chamada, não precisa ser o mesmo que o nome do parâmetro definido no método.
Considere o seguinte código:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
A primeira linha de código cria uma instância da Random classe chamada dice. A segunda linha de código usa o dice.Next(1, 7) método para atribuir um valor aleatório a um inteiro chamado roll. Observe que a instrução de chamada fornece dois argumentos separados por um , símbolo. O Next() método inclui uma assinatura de método que aceita dois parâmetros do tipo int. Esses parâmetros são usados para configurar os limites inferior e superior para o número aleatório retornado. A linha de código final usa o Console.WriteLine() método para imprimir o valor de roll no console.
Os argumentos passados para um método devem ser do mesmo tipo de dados que os parâmetros correspondentes definidos pelo método. Se você tentar passar um argumento digitado incorretamente para um método, o compilador C# detetará seu erro e forçará você a atualizar sua instrução de chamada antes que seu código seja compilado e executado. A verificação de tipo é uma maneira que o C# e o .NET usam para evitar que os usuários finais tenham erros em tempo de execução.
Observação
Embora os parâmetros sejam frequentemente usados, nem todos os métodos exigem parâmetros para concluir sua tarefa. Por exemplo, a Console classe inclui um Console.Clear() método que não usa parâmetros. Como esse método é usado para limpar qualquer informação exibida no console, ele não precisa de parâmetros para concluir sua tarefa.
Métodos sobrecarregados
Muitos métodos na Biblioteca de Classes do .NET têm assinaturas de método sobrecarregado. Entre outras coisas, isso permite que você chame o método com ou sem argumentos especificados na instrução de chamada.
Um método sobrecarregado é definido com múltiplas assinaturas de método. Métodos sobrecarregados fornecem maneiras diferentes de chamar o método ou fornecer diferentes tipos de dados.
Em alguns casos, versões sobrecarregadas de um método são usadas para definir um parâmetro usando diferentes tipos de dados. Por exemplo, o método Console.WriteLine() tem 19 versões sobrecarregadas diferentes. A maioria dessas sobrecargas permite que o método aceite diferentes tipos e, em seguida, grave as informações especificadas no console. Considere o seguinte código:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
Neste exemplo, está a invocar três versões sobrecarregadas separadas do método WriteLine().
- O primeiro
WriteLine()método usa uma assinatura de método que define umintparâmetro. - O segundo
WriteLine()método usa uma assinatura de método que define parâmetros zero. - O terceiro
WriteLine()método usa uma assinatura de método que define umstringparâmetro.
Em outros casos, versões sobrecarregadas de um método definem um número diferente de parâmetros. Os parâmetros alternativos podem ser usados para fornecer mais controle sobre o resultado desejado. Por exemplo, o Random.Next() método tem versões sobrecarregadas que permitem definir vários níveis de restrição no número gerado aleatoriamente.
O exercício a seguir chama o Random.Next() método para gerar valores inteiros aleatórios com diferentes níveis de restrição:
Verifique se você tem um arquivo de Program.cs vazio aberto no Visual Studio Code.
Se necessário, abra o Visual Studio Code e conclua as seguintes etapas para preparar um arquivo de Program.cs no Editor:
No menu Arquivo, selecione Abrir pasta.
Use a caixa de diálogo Abrir pasta para navegar até a pasta CsharpProjects e abri-la.
No modo de exibição Visual Studio Code EXPLORER, selecione Program.cs.
No menu Seleção de código do Visual Studio, selecione Selecionar tudo e pressione a tecla Delete.
Para examinar as versões sobrecarregadas do
Random.Next()método, digite o seguinte código:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");No menu "Arquivo" do Visual Studio Code, clique em "Salvar".
Na vista EXPLORER, para abrir um Terminal na localização da pasta TestProject, clique com o botão direito do rato em TestProject e, em seguida, selecione Abrir no Terminal Integrado.
Verifique se o caminho da pasta exibido no prompt de comando aponta para a pasta que contém o arquivo Program.cs.
No prompt de comando do Terminal, para executar o código, digite dotnet run e pressione Enter.
Observe que seu resultado é semelhante à seguinte saída:
First roll: 342585470 Second roll: 43 Third roll: 89Os números gerados são aleatórios, por isso os seus resultados serão diferentes. No entanto, este exemplo demonstra o intervalo de resultados que você pode ver.
Reserve um minuto para examinar o código.
A primeira versão do método
Next()não define um limite superior e inferior, pelo que o método irá devolver valores que vão desde0até2,147,483,647, que é o valor máximo que umintpode armazenar.A segunda versão do método especifica o
Next()valor máximo como um limite superior, portanto, nesse caso, você pode esperar um valor aleatório entre0e100.A terceira versão do
Next()método especifica os valores mínimo e máximo, portanto, neste caso, você pode esperar um valor aleatório entre50e100.Feche o painel Terminal.
Você já examinou vários tópicos nesta unidade. Aqui está uma lista rápida do que você cobriu:
- Você examinou como usar o valor de retorno de um método (quando o método fornece um valor de retorno).
- Você examinou como um método pode usar parâmetros definidos como tipos de dados específicos.
- Você examinou as versões sobrecarregadas de alguns métodos que incluem diferentes parâmetros ou tipos de parâmetros.
Usar o IntelliSense
O Visual Studio Code inclui recursos do IntelliSense que são alimentados por um serviço de linguagem. Por exemplo, o serviço de linguagem C# fornece completações inteligentes de código com base na semântica da linguagem e uma análise do código-fonte. Nesta seção, você usará o IntelliSense para ajudá-lo a implementar o Random.Next() método.
Como o IntelliSense é exposto dentro do editor de código, você pode aprender muito sobre um método sem sair do ambiente de codificação. O IntelliSense fornece dicas e informações de referência em uma janela pop-up sob o local do cursor à medida que você insere o código. Quando você estiver digitando código, a janela pop-up IntelliSense mudará seu conteúdo dependendo do contexto.
Por exemplo, à medida que você insere a palavra dice lentamente, o IntelliSense mostrará todas as palavras-chave C#, identificadores (ou melhor, nomes de variáveis no código) e classes na Biblioteca de Classes do .NET que correspondem às letras que estão sendo inseridas. Os recursos de preenchimento automático do editor de código podem ser usados para terminar de digitar a palavra que é a correspondência superior no pop-up IntelliSense. Experimente!
Verifique se você tem seu arquivo de Program.cs aberto no Visual Studio Code.
Seu aplicativo deve conter o seguinte código:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");Na parte inferior do ficheiro de código, para experimentar o IntelliSense, introduza lentamente as letras
de, em seguidai,c.Observe a janela pop-up do IntelliSense que aparece quando você começa a digitar.
Quando o IntelliSense aparece, uma lista de sugestões deve aparecer. No momento em que você tiver inserido
dic, o identificadordicedeve estar no topo da lista.Pressione a tecla Tab no teclado.
Observe que a palavra
diceinteira está completada no editor. Você pode usar as teclas de seta para cima e para baixo para alterar a seleção antes de pressionar a tecla Tab.Observação
Se a janela do IntelliSense desaparecer, ela pode ser selecionada usando a
backspacetecla no teclado e, em seguida, digite novamente o último símbolo para reabrir o IntelliSense.Para especificar o operador de acesso de membro, insira um
.caractere.Observe que o pop-up IntelliSense reaparece quando você entra
.e mostra uma lista não filtrada de todos os métodos (e outros membros da classe) que estão disponíveis.Digite N
A lista será filtrada e a palavra deverá ser a seleção
Nextprincipal.Para completar automaticamente a palavra inteira, pressione a tecla Tab.
Para especificar o operador de invocação do método, digite (
Observe que o parêntese de fechamento é adicionado automaticamente para você.
O operador de invocação de método é o conjunto de parênteses localizado à direita do nome do método. Esta parte da instrução de chamada é onde você especifica os argumentos que serão passados para o método. O operador de invocação de método é necessário ao chamar o método.
Observe que o pop-up IntelliSense agora exibe informações detalhadas sobre o
Random.Next()método.Reserve um minuto para examinar o pop-up IntelliSense para o
Random.Next()método.Observação
Se o pop-up do IntelliSense fechou antes de você ter a chance de examiná-lo, exclua o operador
()de invocação e digite ( para exibir o pop-up do IntelliSense.Observe que a janela pop-up inclui três seções, uma à esquerda e duas à direita.
No lado direito, você deve ver
int Random.Next()na seção superior eReturns a non-negative random integer.na seção inferior. Ointdefine o tipo de retorno para o método. Em outras palavras, quando esta versão do método é executada, ele retornará um valor do tipoint.No lado esquerdo do pop-up do IntelliSense, ele exibe
1/3.O
1/3indica que você está examinando a primeira de três assinaturas de método para oNext()método. Observe que esta versão da assinatura do método permite que o método funcione sem parâmetros (sem argumentos passados para o método na instrução de chamada).Observe que há também uma pequena seta acima e abaixo do
1/3.Para examinar a segunda versão sobrecarregada do método, pressione a tecla Seta para baixo no teclado.
Observe que você pode usar as teclas de seta para cima e para baixo para navegar entre as várias versões sobrecarregadas. Quando o fizer, verá o
1/3,2/3e3/3aparecerá no lado esquerdo do pop-up do IntelliSense e explicações úteis à direita.Reserve um minuto para examinar cada uma das versões sobrecarregadas para o
Random.Next()método.A segunda versão sobrecarregada do método,
2/3, informa que oNext()método pode aceitar um parâmetroint maxValue. A descrição informa quemaxValueé o limite superior exclusivo para o número que você deseja que oNext()método gere. Exclusive indica que o número de retorno será inferior a maxValue. Então, quando você especificardice.Next(1,7);o rolo máximo de dados será 6. Observe que a mensagem na parte inferior da seção foi atualizada para:Returns a non-negative random integer that is less than the specified maximum.A terceira versão do método,
3/3, informa que oNext()método pode aceitar ambos eint minValueint maxValuecomo parâmetros. O novo parâmetro,minValue, é um limite inferior para o número que você deseja que oNext()método gere. Como o limite inferior é inclusivo e não exclusivo, o valor de retorno pode ser igual aminValue. A mensagem na parte inferior agora afirma:Returns a random integer that is within a specified range.Nesse caso, o IntelliSense fornece todas as informações necessárias para selecionar a sobrecarga apropriada, incluindo uma explicação detalhada de
maxValueeminValue. No entanto, você pode encontrar situações em que você precisa consultar a documentação do método.
Use learn.microsoft.com para obter informações sobre métodos sobrecarregados
A segunda forma de saber mais sobre as versões sobrecarregadas dos métodos é consultar a documentação do método. A documentação também irá ajudá-lo a entender exatamente para que cada parâmetro se destina.
Para começar, abra o navegador da Web e o mecanismo de pesquisa de sua preferência.
Realizar uma pesquisa por C# Random.Next()
Sua pesquisa deve incluir o nome da classe e o nome do método. Você também pode querer incluir o termo
C#para se certificar de não obter resultados acidentalmente para outras linguagens de programação.Selecione o resultado da pesquisa superior com um URL que comece com
https://learn.microsoft.com.Um dos principais resultados de pesquisa deve levar a um URL que comece com
https://learn.microsoft.com. Neste caso, o título do link deve aparecer comoRandom.Next Method.Eis a ligação caso tenha um problema a encontrá-lo com um motor de busca:
Abra o link para C# Random.Next().
Analise rapidamente a documentação.
Role para baixo pelo conteúdo da página para ver os vários exemplos de código. Observe que você pode executar os exemplos na janela do navegador.
A documentação learn.microsoft.com segue um formato padrão para cada classe e método na Biblioteca de Classes do .NET.
Perto da parte superior da página da Web, localize a seção rotulada Sobrecargas.
Observe que há três versões sobrecarregadas do método listado. Cada versão sobrecarregada listada inclui um hiperlink para um local mais abaixo na página.
Para navegar "na página" até uma descrição da segunda versão sobrecarregada, selecione Next(Int32).
A documentação para cada versão do método inclui:
- Breve descrição da funcionalidade do método
- Definição do método
- Parâmetros que o método aceita
- Valores de retorno
- Exceções que podem ser levantadas
- Exemplos do método utilizado
- Outras observações sobre o método
Reserve um minuto para revisar a seção Parâmetros .
Na seção Parâmetros, você pode ler que o
maxValueparâmetro é o "limite superior exclusivo do número aleatório a ser gerado". Um limite superior exclusivo significa que se você quiser números não maiores do que10, você deve passar o valor11.Você também pode ler na próxima linha: "
maxValuedeve ser maior ou igual a 0". O que acontece se ignorar esta afirmação? Você pode ver na seção Exceções que o método retornará umArgumentOutOfRangeExceptionquandomaxValuefor menor que 0.Observação
O conteúdo em learn.microsoft.com é a "fonte da verdade" para a Biblioteca de Classes do .NET. É importante reservar um tempo para ler a documentação para entender como um determinado método funcionará.
Recapitulação
- Os métodos podem não aceitar parâmetros ou vários parâmetros, dependendo de como foram projetados e implementados. Ao passar vários parâmetros, separe-os com um
,símbolo. - Os métodos podem retornar um valor quando concluem sua tarefa ou podem não retornar nada (void).
- Métodos sobrecarregados suportam várias implementações do método, cada uma com uma assinatura de método exclusiva (o número de parâmetros e o tipo de dados de cada parâmetro).
- O IntelliSense pode ajudar a escrever código mais rapidamente. Ele fornece uma referência rápida aos métodos, seus valores de retorno, suas versões sobrecarregadas e os tipos de seus parâmetros.
- learn.microsoft.com é a "fonte da verdade" quando você deseja aprender como os métodos na Biblioteca de Classes do .NET funcionam.