Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C#]: lokale und "globale" Variablen

Empfohlene Antworten

Veröffentlicht

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*/

}

...

}

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.

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 ?

naja wir wärs so ?

 

public class Form1 : System.Windows.Forms.Form

{

private DataSet theSet = null;

private funktion1()

{

theSet = new DataSet(...);

}

...

private funktion2()

{

theSet.tuWas();

}

...

}

meintest du so ?

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.

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 ...

Hmm .. parent sollte eigentlich reichen:


Button b = new Button();

b.Text = "Bla";

b.Size = new Size(40,20);

b.Location = new Point(200,200);

this.Controls.Add(;

[/code]

Kanns jetzt hier auch net testen, hab auch kein .NET hier :)

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);

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.

kleiner Tipp:

Wenn man auf das Set über ne Property zugreift und im get auf null prüft hat man das Problem an einer Stelle gelöst und man kann es nicht vergessen.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.