Zum Inhalt springen

[C#]: lokale und "globale" Variablen


bmg4ever

Empfohlene Beiträge

ich hab da nochmal ne kleine und wahrscheinlich ziemlich dämliche frage, aber...

wie kann ich in einer Funktion neue Objekte jeglicher art (also einfachstes Beispiel eine integer variable) erstellen, weil sie halt erst von da an gebraucht wird. Das objekt muss nun aber von diesem moment an "global", also als instanz der entsprechenden Klasse verfügbar sein.

ich will diese objekte (in meinem fall konkret sind es datanbanktools, wie sqladapter) halt auch erst speziell in einer funktion erzeugen und nicht schon vorher im code festlegen und dann in der funktion nur speziell intitalisieren, da der benutzer des geplanten programms diese komponenten evtl. nie benötigt.

kann mir da vielleicht mal jemand ein Beispiel für eine integervariable coden:


public class Form1 : System.Windows.Forms.Form

{

.....

private funktion1()

{

int i = 6;

}

...

private funktion2()

{

/*nach aufrufen von funktion1 soll i auch hier und in anderen funktionen verfügbar sein*/

}

...

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Laut deinem Beispel muss i mindestens in der Form global definiert werden. Also dort wo auch die ganzen Controls des Formulars deklariert sind, musst du deinen integer bereitstellen.

Eine andere möglichkeit wäre eine struktur mit öffentlichen statischen Mitgliedern, mit dere Hilfe du dann z.B. von mehreren Formularen drauf zugreifen/ diese nutzen könntest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

erstmal danke mister (cooler nick ;) )

aber täusch ich mich, oder hilft mir eine struktur hier nicht.

die von der struktur erstellte instanz ist doch dann wieder nur lokal und wird beim beenden der funktion vom (manchmal doch nicht so tollen :D) wastebasket des .NET Framework freigegeben.

eigentlich war sinn und zweck der ganze sache einen kompletten datenbankzugriff zur laufzeit zu generieren, also kein element fest zu initialisieren. das dataset ist nun das entscheidende. es muss auch noch nach dem laden der datenbank existieren. so müsste ich im moment alles in eine funktion schreiben und das will ich auf gar keinen fall.

ist es nicht möglich zur laufzeit neue "globale" bzw. klassenlokale objekte egal welcher art zu erzeugen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke bmg4ever. :)

ja, so ungefähr wie Idexe das gemacht hat, z.B...

Das Problem was du dann hast ist, daß du verstärkt auf die Objekte achten musst, auf die du zugreifst, weil du nie weist ob es nicht "null" ist, würde ich sagen.

Zur struktur:


public struct Global

{

    public static string DBName;

    //...

}

Damit solltest du über "Global.DBName" ohne Instanz zugreifen können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke für eure bemühungen

habs jetzt auch so gemacht, wie idexe, obwohl das ja nicht ganz das ist, was ich mir erhofft hatte.

kann ich nun auch, wenn ich neue Komponenten für die Form (z.B. labels oder Buttons) zur leufzeit erzeugen will, diese nur global verfügbar machen, wenn sie mit ihrem namen entsprechend in der klasse vorgemerkt sind?

oder erledigt sich das in einem solchen Fall durch die Zuweisung eines "parent" von alleine?

kann ich leider erst morgen selber ausprobieren. hab zuhause kein .NET ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das geht.

Ich mach das nicht mit Buttons sondern mit Labels, die ich zur Laufzeit erzeuge, aber diese sind dann (wenn fertig erstellt, als != null) verfügbar und man kann auch auf deren Events reagieren, wenn du das meinst. ;)

Allerdings musst du den entsprechenden events natürlich noch einen Handler zuweisen, der auf die dafür zuständige Methode verweist. Um das obige Bsp aufzugreifen:

b.Click += new System.EventHandler(this.b_Click);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wert-Typen (z.B. init) solltest Du immer möglichst frühzeitig initialisieren, z.B. im Konstruktor. Dein Vorhaben macht nur bei Referenz-Typen (z.B. Bitmap) Sinn, deren Objekte relativ viele Resourcen beanspruchen und die wirklich nur selten gebraucht werden.

Einfach, wie bereits vorgeschlagen, eine Variable (Referenz) in der Klasse anlegen und anfangs mit null initialisieren. Du kannst Dir nun eine Init-Methode schreiben, die, wenn sie aufgerufen wird, die Objekte erzeugt, falls dies noch nicht geschehen ist. Diese Methode rufst Du dann einfach zu beginn jeder anderen Funktion auf, die die Objekte benötigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...