Laden...

Globale statische Variablen bereitstellen? [==> nein, besser nicht]

Erstellt von PoWl vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.007 Views
P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 13 Jahren
Globale statische Variablen bereitstellen? [==> nein, besser nicht]

Hi, folgendes Problem:

Ich habe eine Windows Forms Anwendung mit zwei Forms. Diese müssen beide auf gemeinsam genutze Variablen zugreifen können.

Ich habe also die Program.cs in der die Klasse Program mit der Main-Methode drin und die Form1.cs und Form2.cs jeweils mit den entsprechenden Forms-Klassen.

Wo und wie muss ich Variablen definieren, dass sie von überall zugänglich sind?

Die Program-Klasse ist ja keine statische Klasse sondern wird automatisch beim Programmstart instanziiert. Um auf Variablen in dieser Klasse oder in der Main-Methode zugreifen zu können bräuchte ich also eine Referenz auf diese Instanz. Bekomme ich die irgendwo her?

Grüße,
Powl

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

Standardfrage mit Standardlösung:
[FAQ] Kommunikation von 2 Forms

Baka wa shinanakya naoranai.

Mein XING Profil.

P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 13 Jahren

Naja, die Informationen müssen auch bereitstehen wenn gerade keines der beiden Forms offen ist.

643 Beiträge seit 2006
vor 13 Jahren

Dan erstell dir eine zusätzliche Klasse mit der Variable

1.378 Beiträge seit 2006
vor 13 Jahren

Naja, die Informationen müssen auch bereitstehen wenn gerade keines der beiden Forms offen ist.

Das ändert ja nichts daran ob eine Form offen ist oder nicht.

Es gibt einen Punkt in deinem Programm, der deine Forms öffnet(wenn sie unabhängig von einander geöffnet werden). Diese gemeinsam genutzten Variablen musst du dann nur an dem jeweiligen Punkt parat haben um sie den Forms bei bedarf(show) zu übergeben. Dafür brauchst du keine statischen Klassen oder Variablen oder irgendwas in der Richtung.

Lg XXX

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo PoWl,

Die Program-Klasse ist ja keine statische Klasse sondern wird automatisch beim Programmstart instanziiert.

die Programm-Klasse wird keineswegs automatisch instanziiert, selbst dann nicht, wenn sie nicht statisch ist. Eine nicht statische Klasse darf durchaus statische Member besitzen. Davon abgesehen wird sowieso andersherum ein Schuh draus: Eine statische Klasse darf keine Instanzmember besitzen.

Allerdings sollte man wenn irgend möglich gemeinsam genutzte statische Variablen vermeiden.

Davon abgesehen ist mit deine Beschreibung noch zu abstrakt.

herbivore

P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 13 Jahren

OK danke bisher für die Erklärungen.

D.h. es gibt keine Instanz der Programm-Klasse und die Main-Methode wird einfach so beim Programmstart ausgeführt. D.h. Variablen in der Main-Methode sind von Außen nicht zugänglich, richtig?

In meiner Main werden verschiedene Forms instanziiert aber noch nicht geöffnet. Nun möchte ich aus den Forms heraus den Befehl geben, diese anzuzeigen.

Aber da wärn wir wohl wieder beim Thema Kommunikation zwischen 2 (bzw. in meinem Forms) mehreren Forms.

1.552 Beiträge seit 2010
vor 13 Jahren

D.h. Variablen in der Main-Methode sind von Außen nicht zugänglich, richtig? Variablen einer Methode, also Lokale Variablen sind nie von auserhalb der Methode sichtbar. Dies ist nicht nur in der Main Methode so.
die Main-Methode wird einfach so beim Programmstart ausgeführt Die Main Methode ist der Einstiegspunkt des Programms. Ohne so einer lässt sich ein Programm nicht starten.
In meiner Main werden verschiedene Forms instanziiert aber noch nicht geöffnet.

Die Main soll nur eine Form öffen und dies ist die Hauptform.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 13 Jahren

Ach gott ja, natürlich kann man auf Variablen innerhalb einer Methode nicht extern zugreifen. Da hab ich mich selbst verwirrt 😉

Das mit der Hauptform stimmt schon, aber das hätte ja dann zur Konsequenz, dass das Programm geschlossen wird wenn ich die Hauptform schließe.

Ich wollte daher alle Forms gleich in der Main Instanziieren, nacheinander (bei bedarf) öffnen lassen, und wenn die letzte Form geschlossen wurde, sich das Programm beenden lassen. Dazu muss ich aber meiner Meinung nach in einer globalen Variable speichern, wie viele Forms gerade offen sind.

Jetzt wird mir wahrscheinlich gesagt werden, dass es schlecht designed wäre, wenn ich mir dazu eine Hilfs-Klasse erstelle, die eine globale statische Variable beinhaltet. Welches Konzept ist besser?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo PoWl,

Jetzt wird mir wahrscheinlich gesagt werden, dass es schlecht designed wäre, wenn ich mir dazu eine Hilfs-Klasse erstelle, die eine globale statische Variable beinhaltet.

so ist es! 😃

Im Grunde wäre dafür eine zwar statische, aber private Variable das richtige, die im Konstruktor der Basis-Klasse erhöht und im Disposed-Event vermindert wird (so wie von Prinzip her in Schließen eines Forms, ohne die komplette Anwendung zu schließen [war: Form- und Codehandling] gezeigt). Die Variable muss nicht mal protected sein, denn der Zugriff erfolgt ja wirklich nur direkt aus der Basisklasse, selbst dann, wenn Objekte der Unterklasse erzeugt und zerstört werden. Die einzige Herausforderung ist, dass du die (momentane) Basisklasse Form nicht ändern kannst. Du kannst aber eine eigene Klasse von Form ableiten und die dann als Basisklasse aller deiner Forms verwenden. Damit ist das Problem vollkommen ohne globale Zugriffe gelöst.

herbivore