Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Zugriff auf Objekt, das in einem try Block erzeugt wurde
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

Zugriff auf Objekt, das in einem try Block erzeugt wurde

beantworten | zitieren | melden

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. ?
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 163

beantworten | zitieren | melden

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

beantworten | zitieren | melden

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


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


private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 163

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1821
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
degri2006
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

beantworten | zitieren | melden

Ok. Danke für die Tipps.
private Nachricht | Beiträge des Benutzers