Hallo,
beide Themen haben eigentlich nur wenig miteinander zu tun. Aber die Konsequenzen hängen durchaus zusammen.
try-catch ist die Behandlung von Ausnahmen. Es sollte nicht dazu dienen, den normalen Arbeitsablauf zu steuern. Beispiele:
*
if(FileExists) ist sinnvoller, als eine FileNotFoundException auszuwerten.
*
if(int.TryParse()) ist sinnvoller als int.Parse oder gar Convert.ToInt32 und auf eine Exception zu reagieren.
Bei
using geht es darum, dass eine Instanz automatisch aufgelöst werden soll, ohne dass das im Einzelfall (unabhängig von Fehlern) ausdrücklich geregelt werden muss. Das gilt beispielsweise für:
* Abruf von Daten aus einer Datenbank per DataReader
* Lesen aus einer Datei per FileStream
* genauso Schreiben
* Bilder anzeigen
In allen diesen Fällen wird die benutzte Ressource erst dann freigegeben, wenn ausdrücklich Dispose aufgerufen wird. Das hängt mit der Definition der Klasse zusammen; es gilt für jede Klasse, die mit der Schnittstelle
IDisposable definiert wird (ausführliche Begründung steht unter diesem Stichwort in der SDK-Doku/MSDN/Hilfe). Du kannst dir also merken:
Zitat: |
Bei jeder Klasse, die IDisposable implementiert hat, ist Dispose ausdrücklich zu verwenden. Dies erspart man sich, wenn man die betreffende Instanz in einen using-Block kapselt, weil dann der Compiler für Dispose sorgt. |
Die beiden folgenden Lösungen sind im wesentlichen identisch:
C#-Quelltext
1: 2: 3: 4: 5:
| StreamWriter sw = new StreamWriter(fileName,true); sw.Write(textToAdd); sw.Flush(); sw.Close(); sw.Dispose(); |
C#-Quelltext
1: 2: 3:
| using( StreamWriter sw = new StreamWriter(fileName,true) ) { sw.Write(textToAdd); } |
Du siehst: Der using-Block sorgt "nur" dafür, dass Close und Dispose niemals vergessen werden (und dieser Code ist kürzer und schöner).
Mit try-catch-finally hat das eigentlich nichts zu tun. Aber wenn du jetzt Fehlerbehandlung einbauen willst, wird das einfacher.
Gruß Jürgen