Ejercicio: Exploración de Clear() y Resize()
- 15 minutos
A medida que siga desarrollando un seguimiento de pallets para la empresa de logística, es probable que necesite realizar el seguimiento de nuevos pallets y eliminar los antiguos del sistema de seguimiento. Por lo tanto, ¿cómo se puede crear una funcionalidad de seguimiento que permita la adición y eliminación de pallets?
Usar métodos de matriz para borrar y cambiar de tamaño una matriz
El método Array.Clear() permite eliminar el contenido de elementos específicos de la matriz y reemplazarlos por el valor predeterminado de la matriz. Por ejemplo, si borra un elemento de una matriz string, el valor borrado se reemplaza por null. Del mismo modo, cuando se borra un elemento de una matriz int, el reemplazo es 0 (cero).
El método Array.Resize(), por otro lado, permite agregar o quitar elementos de la matriz.
Elimine o use el operador de comentario de línea
//para comentar todo el código de los pasos anteriores.Actualice el código en el editor de Visual Studio Code de la siguiente manera:
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}"); }Nota
En este ejemplo se usa la sintaxis de expresiones collection, introducida en C# 12 y compatible con .NET 10.
Dedique un minuto a centrarse en la línea de código
Array.Clear(pallets, 0, 2);.Aquí, usará el método
Array.Clear()para borrar los valores almacenados en los elementos de la matrizpallets, comenzando en el índice0, y borrará2elementos.En el menú Archivo Visual Studio Code, seleccione Guardar.
El archivo Program.cs debe guardarse antes de compilar o ejecutar el código.
En el panel EXPLORADOR, para abrir un terminal en la ubicación de la carpeta TestProject, haga clic con el botón derecho en TestProject y seleccione abrir en terminal integrado.
Debe abrirse un panel de terminal y debe incluir un símbolo del sistema que muestre que el terminal está abierto en la ubicación de la carpeta TestProject.
En el símbolo del sistema del terminal, para ejecutar el código, escriba dotnet run y presione Intro.
Nota
Si ve un mensaje que indica "No se ha podido encontrar un proyecto para ejecutar", asegúrese de que el símbolo del sistema del terminal muestra la ubicación de carpeta TestProject prevista. Por ejemplo:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Al ejecutar el código, verá que los valores almacenados en los dos primeros elementos de la matriz se borran. En la propiedad
Lengthy la instrucciónforeach, los elementos siguen existiendo, pero ahora están vacíos.Clearing 2 ... count: 4 -- -- -- B12 -- A13
Cadena vacía frente a cadena nula
Cuando se usa Array.Clear(), los elementos que borramos ya no hacen referencia a una cadena en memoria; de hecho, los elementos no apuntan absolutamente a nada. Apuntar a nada es un concepto importante que puede ser difícil de entender al principio.
¿Y si se intenta recuperar el valor de un elemento afectado por el método Array.Clear(), se podría hacer?
Acceso al valor de un elemento borrado
Se necesitan dos enfoques para determinar el valor de un elemento borrado a fin de ver cómo funciona el compilador de C# con un valor NULL.
Inserte nuevas líneas de código alrededor de la línea de código
Array.Clear(pallets, 0, 2);de la manera siguiente:Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}");Compruebe que el código coincide con la lista de códigos siguiente:
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}"); }Guarde el archivo de código y use Visual Studio Code para ejecutar el código.
Debería ver el siguiente resultado:
Before: B14 After: Clearing 2 ... count: 4 -- -- -- B12 -- A13
Si nos fijamos en la línea del resultado After: , podríamos pensar que el valor almacenado en pallets[0] es una cadena vacía. Sin embargo, el compilador de C# convierte implícitamente el valor nulo en una cadena vacía por motivos de visualización.
Llamada a un método auxiliar de cadena en un elemento borrado
Para demostrar que el valor almacenado en pallets[0] tras el borrado es nulo, modificará el código de ejemplo para llamar al método ToLower() en pallets[0]. Si es una cadena, debería funcionar correctamente, pero si es nulo, debería producir una excepción en el código.
Para llamar al método
ToLower()cada vez que intente escribirpallets[0]en la consola, actualice el código de la siguiente manera:Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}");Asegúrese de que el código coincide con la siguiente lista 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}"); }Guarde el archivo de código y use Visual Studio Code para ejecutar el código. Esta vez, al ejecutar el código, verá un mensaje de error grande. Si analiza el texto, verá el siguiente mensaje:
System.NullReferenceException: Object reference not set to an instance of an object.Esta excepción se produce porque estamos intentando llamar al método en el contenido del elemento
pallets[0]antes de que el compilador de C# tenga la oportunidad de convertir implícitamente un valor nulo en una cadena vacía.Esto significa que
Array.Clear()elimina la referencia de un elemento de matriz a un valor si existe. Para solucionar este error, podría buscar un valor nulo antes de intentar imprimir el valor.Para evitar el error, agregue una instrucción
ifantes de acceder a un elemento de matriz que sea nulo en potencia.
if (pallets[0] != null)
Console.WriteLine($"After: {pallets[0].ToLower()}");
Cambio de tamaño de la matriz para agregar más elementos
Ahora, rediseñe la lista de código del paso 1 para incluir más código a fin de cambiar el tamaño de la matriz. Cuando acabemos, el código debería coincidir con la siguiente lista 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 unos minutos a centrarse en la línea
Array.Resize(ref pallets, 6);.Aquí, va a llamar al método
Resize(), y pasará la matrizpalletspor referencia mediante la palabra claveref. Algunas veces, los métodos requieren que se pasen argumentos por valor (comportamiento predeterminado) o por referencia (mediante la palabra clave ref). Los motivos por los que este paso es necesario requieren una explicación larga y complicada sobre cómo se administran los objetos en .NET. algo que desgraciadamente va más allá del ámbito de este tema. En caso de duda, se recomienda consultar IntelliSense o Microsoft Docs para ver ejemplos sobre cómo llamar a un determinado método del modo adecuado.En este caso, va a aumentar el tamaño de la matriz
palletsde cuatro elementos a6. Los elementos nuevos se agregan al final de los elementos actuales. Los dos nuevos elementos son null hasta que se asigna un valor a ellos.Guarde el archivo de código y use Visual Studio Code para ejecutar el código. Al ejecutar el código, debería ver la salida siguiente.
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02
Cambio de tamaño de la matriz para quitar elementos
Por otro lado, también se pueden quitar elementos de la matriz mediante Array.Resize().
Actualice el código en el editor de Visual Studio Code de la siguiente manera:
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}"); }Guarde el archivo de código y use Visual Studio Code para ejecutar el código. Al ejecutar el código, debería ver la siguiente salida:
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02 Resizing 3 ... count: 3 -- -- -- B12Fíjese en que la llamada a
Array.Resize()no eliminó los dos primeros elementos nulos, sino que se quitaron los tres últimos elementos. En concreto, los tres últimos elementos se quitaron aunque contenían valores de cadena.
¿Se pueden quitar elementos nulos de una matriz?
Si el método Array.Resize() no quita elementos vacíos de una matriz, ¿existe otro método auxiliar que realice el trabajo automáticamente? Núm. La mejor forma de vaciar elementos de una matriz sería contar el número de elementos no nulos recorriendo en iteración cada elemento y aumentando una variable (un contador). Luego, habría que crear una segunda matriz que fuese del tamaño de la variable del contador. Por último, habría que recorrer cada elemento de la matriz original y copiar los valores no nulos en la nueva matriz.
Resumen
Estas son algunas ideas importantes que se han abordado en esta unidad:
- Use el método
Clear()para vaciar los valores de los elementos de la matriz. - Use el método
Resize()para cambiar el número de elementos de la matriz, ya sea quitando o agregando elementos del final de la matriz. - Los elementos de matriz, tanto los nuevos como los borrados, son nulos, lo que significa que no apuntan a un valor en memoria.