Hallo,
ich habe eine Frage. Ich habe eine Klasse Foo, die das Interface IDisposable implementiert und im Konstruktor eine Exception werfen kann. Die Klasse wurde von einem Kollegen erstellt.
Ich erzeuge ein Objekt der Klasse Foo mit using.
public class Foo : IDisposable
{
...
Foo()
{
...
throw new AAAException
}
...
}
Ich will einen try-catch Block haben, um die evtl. autretende Exception abzufangen:
try
{
using var foo = new Foo();
}
catch (AAAExpception ex)
{
....
}
Problem: Wenn keine Expception geworfen wird, kann ich von ausserhalb des try Blocks nicht auf foo zugreifen, weil foo im try Block erzeugt wurde. Was gibt es für Alternativen?
Du kannst/darfst doch die Instanz wegen des using
sowieso nur innerhalb des Using-Blocks ansprechen/benutzen?
Was genau möchtest du erreichen?
Habe keine using Block.
Bei mir sieht im Prinzip so aus:
public class AndereKlasse
{
...
public void machwas()
{
using var foo = new Foo();
...
foo.methode();
}
...
}
Auch wenn du das using ohne Klammern verwendest wird ein Using-Scope "generiert".
Aus diesem Code:
try
{
using var foo = new Foo();
foo.methode();
}
catch (AAAExpception ex)
{
....
}
wird vom Compiler ungefähr das hier gemacht:
try
{
using (var foo = new Foo())
{
foo.methode();
}
}
catch (AAAExpception ex)
{
....
}
siehe auch
Pattern based using and using declarations - C# 8.0 specification proposals | Microsoft Docs
using-Anweisung – C#-Referenz | Microsoft Docs
Wenn du im Konstruktor eine Exception wirfst, würde ich das Objekt nicht außerhalb des try/catch verwenden.
Durch die Exception hast du ggf. eine fehlerhafte Instanz.
Wenn du das fertige Objekt noch irgendwo innerhalb deiner AndereKlasse brauchst, dann mach aus foo einen Member.
Dann musst du diesen nur initalisieren und wenn alles ohne Fehler durchläuft, kannst du normal damit arbeiten.
Ggf. fehlen dir hier nur die nötigen Grundlagen?
Was dannoe meint ist das using vor deiner Variable.
Damit wird dein Objekt automatisch disposed, was du hier scheinbar eigentlich nicht willst.
Hier musst du dann deine Instanz, wenn an anderen Stellen benötigt, an einer geeigeneten Stelle zu disposen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.