Esercizio - Esplorare Clear() e Resize()
- 15 minuti
Man mano che si continua a sviluppare un tracker pallet per l'azienda logistica, è probabile che sia necessario tenere traccia di nuovi pallet e rimuovere quelli vecchi dal sistema di tracciamento. In che modo è possibile creare una funzionalità di tracciamento che consenta l'aggiunta e la rimozione di pallet?
Usare i metodi per le matrici per cancellare e ridimensionare una matrice
Il metodo Array.Clear() consente di eliminare il contenuto di elementi specifici nella matrice e sostituirlo con il valore predefinito della matrice. Ad esempio, se si cancella un elemento in una matrice di string, il valore cancellato viene sostituito con null. Analogamente, quando si cancella un elemento in una matrice di int, la sostituzione è 0 (zero).
Il metodo Array.Resize(), invece, consente di aggiungere o rimuovere elementi dalla matrice.
Eliminare o usare l'operatore di commento riga
//per impostare come commento tutto il codice degli esercizi precedenti.Aggiornare il codice nell'editor di Visual Studio Code come indicato di seguito:
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
In questo esempio viene usata la sintassi dell'espressione Collection, introdotta in C# 12 e supportata in .NET 10.
Prendersi un momento per concentrarsi sulla riga di codice
Array.Clear(pallets, 0, 2);.In questo caso si usa il metodo
Array.Clear()per cancellare i valori archiviati negli elementi della matricepallets, a partire dall'indice0, e cancellare gli elementi2.Nel menu File di Visual Studio Code, selezionare Salva.
Il file Program.cs deve essere salvato prima di compilare o eseguire il codice.
Nel pannello ESPLORA RISORSE, per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject, quindi scegliere Apri nel terminale integrato.
Verrà aperto un pannello del terminale con un prompt dei comandi che indica che il terminale è aperto al percorso della cartella TestProject.
Nel prompt dei comandi del terminale, digitare dotnet run per eseguire il codice, quindi premere INVIO.
Nota
Se viene visualizzato un messaggio che indica "Impossibile trovare un progetto da eseguire", assicurarsi che il prompt dei comandi del terminale visualizzi il percorso previsto della cartella TestProject. Ad esempio:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Quando si esegue il codice, si noterà che i valori archiviati nei primi due elementi della matrice sono stati cancellati. Nella proprietà
Lengthe nell'istruzioneforeach, gli elementi esistono ancora, ma sono ora vuoti.Clearing 2 ... count: 4 -- -- -- B12 -- A13
Stringa vuota e null
Quando si usa Array.Clear(), gli elementi cancellati non fanno più riferimento a una stringa in memoria. In realtà, l'elemento non punta proprio a nulla. Puntare a nulla è un concetto importante, che può essere difficile da comprendere in un primo momento.
Cosa accade se si tenta di recuperare il valore di un elemento interessato dal metodo Array.Clear(), è possibile farlo?
Accedere al valore di un elemento cancellato
Sono necessari due approcci per determinare il valore di un elemento cancellato per vedere come funziona il compilatore C# con un valore Null.
Inserire nuove righe di codice intorno alla riga di codice
Array.Clear(pallets, 0, 2);come indicato di seguito:Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}");Verificare che il codice corrisponda all’elenco di codice seguente:
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}"); }Salvare il file di codice e quindi usare Visual Studio Code per eseguire il codice.
Verrà visualizzato l'output seguente:
Before: B14 After: Clearing 2 ... count: 4 -- -- -- B12 -- A13
Se si osserva la riga di output After: , si potrebbe pensare che il valore archiviato in pallets[0] sia una stringa vuota. Tuttavia, il compilatore C# converte in modo implicito il valore null in una stringa vuota per la presentazione.
Invocare un metodo stringa helper su un elemento cancellato
Per dimostrare che il valore archiviato in pallets[0], dopo essere stato cancellato è Null, si modificherà l'esempio di codice per invocare il metodo ToLower() su pallets[0]. Se è una stringa, dovrebbe funzionare correttamente, ma, se è null, il codice genererà un'eccezione.
Per invocare il metodo
ToLower()ogni volta che si tenta di scriverepallets[0]nella console, aggiornare il codice nel modo seguente:Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}");Verificare che il codice corrisponda al listato di codice seguente:
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}"); }Salvare il file di codice e quindi usare Visual Studio Code per eseguire il codice. Questa volta, quando si esegue il codice, viene visualizzato un messaggio di errore di grandi dimensioni. Se si analizza il testo, viene visualizzato il messaggio seguente:
System.NullReferenceException: Object reference not set to an instance of an object.Questa eccezione viene generata perché il tentativo di invocare il metodo sul contenuto dell'elemento
pallets[0]si verifica prima che il compilatore C# abbia la possibilità di convertire in modo implicito Null in una stringa vuota.In sostanza,
Array.Clear()rimuove il riferimento di un elemento della matrice a un valore, se esistente. Per risolvere questo problema, è possibile verificare la presenza di Null prima di tentare di stampare il valore.Per evitare l'errore, aggiungere un'istruzione
ifprima di accedere a un elemento della matrice che sia potenzialmente Null.
if (pallets[0] != null)
Console.WriteLine($"After: {pallets[0].ToLower()}");
Ridimensionare la matrice per aggiungere altri elementi
Rielaborare quindi l'elenco di codice del passaggio 1 per includere il codice per ridimensionare la matrice. Al termine, il codice deve corrispondere al listato di codice seguente:
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}"); }Dedicare alcuni minuti a concentrarsi sulla riga
Array.Resize(ref pallets, 6);.In questo caso, si invoca il metodo
Resize(), passando nella matricepalletsper riferimento, usando la parola chiaveref. In alcuni casi, i metodi richiedono di passare gli argomenti per valore (impostazione predefinita) o per riferimento (usando la parola chiave ref). I motivi per cui questa operazione è necessaria richiedono una spiegazione lunga e complessa del modo in cui gli oggetti vengono gestiti in .NET. ma purtroppo questo argomento non rientra nell'ambito di questo modulo. In caso di dubbi, è consigliabile esaminare IntelliSense o Microsoft Docs per esempi su come invocare correttamente un determinato metodo.In questo caso, si ridimensiona la matrice
palletsda quattro elementi a6. I nuovi elementi vengono aggiunti alla fine degli elementi correnti. I due nuovi elementi sono Null finché non si assegna ad essi un valore.Salvare il file di codice e quindi usare Visual Studio Code per eseguire il codice. Quando si esegue il codice, viene visualizzato l'output seguente.
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02
Ridimensionare la matrice per rimuovere gli elementi
Al contrario, è possibile rimuovere gli elementi della matrice usando Array.Resize().
Aggiornare il codice nell'editor di Visual Studio Code come indicato di seguito:
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}"); }Salvare il file di codice e quindi usare Visual Studio Code per eseguire il codice. Quando si esegue il codice, viene visualizzato l'output seguente:
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02 Resizing 3 ... count: 3 -- -- -- B12Si noti che la chiamata a
Array.Resize()non ha eliminato i primi due elementi null, Invece ha rimosso gli ultimi tre elementi. In particolare, gli ultimi tre elementi sono stati rimossi anche se contengono valori stringa.
È possibile rimuovere elementi Null da una matrice?
Se il metodo Array.Resize() non rimuove elementi vuoti da una matrice, esiste un altro metodo helper che esegue automaticamente il processo? No. Il modo migliore per svuotare gli elementi da una matrice consiste nel contare il numero di elementi non Null eseguendo l'iterazione di ogni elemento e incrementando una variabile (un contatore). Successivamente, si crea una seconda matrice che corrisponde alla dimensione della variabile contatore. Infine, si scorre ciclicamente ogni elemento nella matrice originale e si copiano i valori non null nella nuova matrice.
Riepilogo
Ecco alcune idee importanti illustrate in questa unità:
- Usare il metodo
Clear()per svuotare i valori degli elementi nella matrice. - Usare il metodo
Resize()per modificare il numero di elementi nella matrice, rimuovendo o aggiungendo elementi dalla fine della matrice. - I nuovi elementi della matrice e gli elementi cancellati sono null, ovvero non puntano a un valore in memoria.