Laden...

Zugriff auf Objekt, das in einem try Block erzeugt wurde

Erstellt von degri2006 vor 3 Jahren Letzter Beitrag vor 3 Jahren 325 Views
D
degri2006 Themenstarter:in
21 Beiträge seit 2009
vor 3 Jahren
Zugriff auf Objekt, das in einem try Block erzeugt wurde

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?

  1. AAAException im Konstrukor von Foo behandeln
  2. Alle Sachen, die auf foo zugreifen in den try Block reinschieben
  3. ?
D
261 Beiträge seit 2015
vor 3 Jahren

Du kannst/darfst doch die Instanz wegen des using sowieso nur innerhalb des Using-Blocks ansprechen/benutzen?
Was genau möchtest du erreichen?

D
degri2006 Themenstarter:in
21 Beiträge seit 2009
vor 3 Jahren

Habe keine using Block.
Bei mir sieht im Prinzip so aus:


public class AndereKlasse
{
	...
	public void machwas()
	{
		using var foo = new Foo();
		...
		foo.methode();
	}
	...
}  


D
261 Beiträge seit 2015
vor 3 Jahren

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

T
2.224 Beiträge seit 2008
vor 3 Jahren

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.

D
degri2006 Themenstarter:in
21 Beiträge seit 2009
vor 3 Jahren

Ok. Danke für die Tipps.