Exercício – Explorar os métodos Clear() e Resize()
- 15 minutos
À medida que você continua a desenvolver um rastreador de paletes para a empresa de logística, é provável que você precise rastrear novos paletes e remover os antigos do sistema de acompanhamento. Então, como você pode criar uma funcionalidade de acompanhamento que permite a adição e remoção de paletes?
Usar métodos de matriz para limpar e redimensionar uma matriz
O método Array.Clear() permite eliminar o conteúdo de elementos específicos em sua matriz, substituindo-os pelo valor padrão da matriz. Por exemplo, se você limpar um elemento em uma matriz string, o valor desmarcado será substituído por null. Da mesma forma, quando você limpa um elemento em uma matriz int, a substituição é 0 (zero).
O método Array.Resize(), por outro lado, permite que você adicione ou remova elementos de sua matriz.
Exclua ou use o operador de comentário de linha
//para comentar todo o código dos exercícios anteriores.Atualize seu código no Editor do Visual Studio Code da seguinte maneira:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }Observação
Este exemplo usa a Sintaxe de expressão de coleção, introduzida no C# 12.
Reserve um minuto para se concentrar na linha de código
Array.Clear(pallets, 0, 2);.Aqui, você usa o método
Array.Clear()para limpar os valores armazenados nos elementos da matrizpallets, começando no índice0e limpando os2elementos.No menu Arquivo do Visual Studio Code, selecione Salvar.
O arquivo Program.cs deve ser salvo antes de criar ou executar o código.
No painel EXPLORER, para abrir o Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.
Um painel Terminal deve ser aberto e incluir um prompt de comando mostrando que o Terminal está aberto no local da pasta TestProject.
No prompt de comando do Terminal, para executar o código, digite dotnet run e pressione Enter.
Observação
Se você vir uma mensagem com a mensagem "Não foi possível encontrar um projeto a ser executado", verifique se o prompt de comando Terminal exibe o local esperado da pasta TestProject. Por exemplo:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Ao executar o código, você verá que os valores armazenados nos dois primeiros elementos da matriz são desmarcados. Na propriedade
Lengthe na instruçãoforeach, os elementos ainda existem, mas agora estão vazios.Clearing 2 ... count: 4 -- -- -- B12 -- A13
Cadeia de caracteres vazia versus nula
Quando você usa Array.Clear(), os elementos que foram limpos não referenciam mais uma cadeia de caracteres na memória. Na verdade, o elemento não aponta para nada. Apontar para nada é um conceito importante que pode ser difícil de entender a princípio.
E se você tentar recuperar o valor de um elemento afetado pelo método Array.Clear(), poderá fazer isso?
Acessar o valor de um elemento que foi limpo
Duas abordagens são necessárias para determinar o valor de um elemento que foi limpo para ver como o compilador do C# opera com o valor nulo.
Insira novas linhas de código ao redor da linha
Array.Clear(pallets, 0, 2);, da seguinte maneira:Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}");Verifique se o seu código corresponde à seguinte listagem de código:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }Salve o arquivo de código e use o Visual Studio Code para executá-o.
A seguinte saída deve ser exibida:
Before: B14 After: Clearing 2 ... count: 4 -- -- -- B12 -- A13
Se você se concentrar na linha de saída After: , poderá achar que o valor armazenado em pallets[0] é uma cadeia de caracteres vazia. No entanto, o compilador C# converte implicitamente o valor nulo em uma cadeia de caracteres vazia para apresentação.
Chamar um método auxiliar de cadeia de caracteres em um elemento limpo
Para provar que o valor armazenado em pallets[0] após ser limpo é nulo, você modificará o exemplo de código para chamar o método ToLower() em pallets[0]. Se for uma cadeia de caracteres, ele deverá funcionar corretamente. Mas se for nulo, ele deverá fazer com que o código gere uma exceção.
Para chamar o método
ToLower()sempre que você tentar escreverpallets[0]no console, atualize o código da seguinte maneira:Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}");Verifique se o código corresponde à seguinte listagem de código:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }Salve o arquivo de código e use o Visual Studio Code para executá-o. Desta vez, ao executar o código, você verá uma mensagem de erro grande. Se você analisar o texto, verá a seguinte mensagem:
System.NullReferenceException: Object reference not set to an instance of an object.Essa exceção é gerada porque a tentativa de chamar o método no conteúdo do elemento
pallets[0]acontece antes que o compilador do C# tenha a chance de converter implicitamente o valor nulo para uma cadeia de caracteres vazia.A moral da história é que
Array.Clear()remove a referência de um elemento de matriz a um valor se houver. Para corrigir isso, você pode verificar se o valor é nulo antes de tentar imprimi-lo.Para evitar o erro, adicione a instrução
ifantes de acessar o elemento da matriz que pode ser nulo.
if (pallets[0] != null)
Console.WriteLine($"After: {pallets[0].ToLower()}");
Redimensionar a matriz para adicionar mais elementos
Em seguida, altere o código da Etapa 1 para redimensionar a matriz. Quando concluído, o código deverá corresponder à seguinte listagem de código:
string[] pallets = ["B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }Dedique alguns minutos para se concentrar na linha
Array.Resize(ref pallets, 6);.Aqui, você está chamando o método
Resize()passando a matrizpalletspor referência, usando a palavra-chaveref. Em alguns casos, os métodos exigem a passagem de argumentos por valor (o padrão) ou por referência (usando a palavra-chave ref). Para explicar o motivo disso é preciso uma explicação longa e complicada sobre como os objetos são gerenciados no .NET. Isso não está no escopo deste módulo. Em caso de dúvida, recomendamos que examine o IntelliSense ou o Microsoft Docs para ver exemplos da forma correta de chamar determinado método.Nesse caso, você está redimensionando a matriz
palletsde quatro elementos para6. Os novos elementos são adicionados ao final dos elementos atuais. Os dois novos elementos são nulos até que você atribua um valor a eles.Salve o arquivo de código e use o Visual Studio Code para executá-o. Ao executar o código, você verá a seguinte saída.
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02
Redimensionar a matriz para remover elementos
Por outro lado, você pode remover elementos da matriz usando Array.Resize().
Atualize seu código no Editor do Visual Studio Code da seguinte maneira:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 3); Console.WriteLine($"Resizing 3 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }Salve o arquivo de código e use o Visual Studio Code para executá-o. Ao executar o código, você verá a seguinte saída:
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02 Resizing 3 ... count: 3 -- -- -- B12Observe que a chamada de
Array.Resize()não eliminou os dois primeiros elementos nulos. Em vez disso, ele removeu os últimos três elementos. Observe que os últimos três elementos foram removidos, embora estivessem preenchidos com cadeias de caracteres.
É possível remover elementos nulos de uma matriz?
Se o método Array.Resize() não remover elementos vazios de uma matriz, há outro método auxiliar que faz o trabalho automaticamente? Não. A melhor maneira de esvaziar os elementos de uma matriz é contar o número de elementos não nulos percorrendo cada item e incrementando uma variável (contador). Em seguida, você criará uma segunda matriz que tem o tamanho da variável do contador. Por fim, você executará um loop em cada elemento na matriz original e copiará valores não nulos na nova matriz.
Recapitulação
Estes são alguns conceitos importantes que você abordou nesta unidade:
- Use o método
Clear()para esvaziar os valores dos elementos na matriz. - Use o método
Resize()para alterar o número de elementos na matriz, removendo ou adicionando elementos do final da matriz. - Os novos elementos da matriz e os elementos limpos são nulos, o que significa que eles não apontam para um valor na memória.