Using vs. try-finally
Fa parte della sezione Logica e flusso del percorso C# di Coddy. Lezione 28 di 66.
Sia le istruzioni using sia i blocchi try-finally aiutano a gestire le risorse che devono essere rilasciate correttamente. L'istruzione using offre un modo più pulito e conciso per assicurarsi che gli oggetti IDisposable vengano ripuliti correttamente.
Nota: using sostituisce il modello try-finally per il rilascio delle risorse. Non sostituisce try-catch. Puoi comunque racchiudere un blocco using all'interno di un try-catch per gestire le eccezioni.
Per prima cosa, diamo un’occhiata all’approccio try-finally:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
L'istruzione using semplifica questo codice:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
L'istruzione using chiama automaticamente Dispose() quando si esce dal blocco, anche se si verifica un'eccezione.
Che cos'è StreamReader?StreamReader è una classe usata per leggere testo dai file. Ne crei una passando un nome di file e apre il file per la lettura. Implementa IDisposable, quindi deve essere chiusa correttamente dopo l'uso, ed è proprio questo che using gestisce per te.
Metodi comuni di StreamReader:
ReadToEnd(): legge l'intero file come un'unica stringaReadLine(): legge una riga alla volta, restituiscenullquando viene raggiunta la fine del file
Per contare le righe in un file, puoi usare un ciclo ReadLine():
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
Puoi anche combinare using con try-catch per gestire eccezioni come quella di un file mancante:
try
{
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
Sfida
FacileCrea un metodo chiamato processFile che:
- Accetti un nome di file come parametro stringa
- Usi l'istruzione
usingcon unStreamReaderper leggere tutte le righe dal file - Restituisca il numero di righe nel file
- Se si verifica una
FileNotFoundException, stampi "File not found" e restituisca -1
Provalo tu
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Scrivi il tuo codice qui
}
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Array multidimensionali
Fondamenti degli array 2DDichiarare e inizializzare array 2DAccedere agli elementi di un array 2DCicli annidati con array 2DArray irregolariOperazioni comuni sulle matriciRipasso: array multidimensionali4Tecniche di controllo del flusso
Uscite anticipateClausole di guardiaIstruzioni di salto (goto)Break e continueAppiattire le condizioni annidate2Decisioni avanzate
Condizioni multipleLogica booleana complessaConfronto tra if e switchIstruzioni switch annidateRiepilogo - decisioni avanzate5Gestione delle eccezioni
Nozioni di base su try-catchTipi di eccezioneBlocchi catch multipliLavorare con i fileBlocco finallyUsing vs. try-finallyEccezioni personalizzateRiepilogo - gestione degli errori3Miglioramenti dei cicli
Prestazioni dei cicliIterare strutture complesseOgni tipo di cicloRifattorizzare i cicliRiepilogo - Cicli ottimizzati6Gestione dei valori null
Fondamenti dei riferimenti nullTipi valore nullableSchemi di controllo dei valori nullProgrammazione difensivaRiepilogo: sicurezza rispetto ai valori nullEsercitati da solo: Compilatore C# online