Laden...

Ein Objekt Global deklarieren? Geht das?

Erstellt von DaJackel vor 18 Jahren Letzter Beitrag vor 18 Jahren 38.022 Views
D
DaJackel Themenstarter:in
6 Beiträge seit 2006
vor 18 Jahren
Ein Objekt Global deklarieren? Geht das?

Hallo! Ich bin gerade dabei mich etwas in C# einzugewöhnen und möchte für meine Anwendung gerne ein Objekt deklarieren, welches ich von überall her ansprechen kann. Daher Global verfügbar ist. An diesem Objekt möchte ich ein paar andere Objekte die ich "immer" brauche anhängen.

Ich dachte an ein Objekt das ich beim Programmstart erstelle und halt von jedem anderen Objekt sei es nun eine Form oder ein Control aus dran komme.

Wie muss ich das machen?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo DaJackel,

such mal nach Singleton. Das ist, was du machen willst. Ist aber nur für wirklich übergreifenden Informationen zu empfehlen, wie z.B. Benutzerberechtigungen. Für die eigentlichen Daten/Objekte der Anwendung sollte man keinesfalls Singletons verwenden.

herbivore

D
DaJackel Themenstarter:in
6 Beiträge seit 2006
vor 18 Jahren
Danke!

Danke, jetzt habe ich wenigstens einen Begriff wonach ich suchen kann.

C
192 Beiträge seit 2005
vor 18 Jahren

Das ist ganz leicht, daher erkläre ich es an einem Beispiel:


public class Global
{
   public static int eineZahl = 10;
   public static void macheWas()
   {
   }
}

// in .NET 2.0 gehts auch so:
public static class Global
{
  // wie oben...
}

Also du brauchst das Schlüsselwort static
Zugreifen kannst du dann von überall aus mit Global.macheWas() oder mit Global.eineZahl = 5;

P.S. Das ist das Singleton entwurfsmuster

L
667 Beiträge seit 2004
vor 18 Jahren

@cmpxchg

Leider hat Dein Beispiel nichts mit dem Singleton-Entwurfsmuster zu tun.

Ein Beispiel für das Singleton-Muster sähe z.B. so aus :



public class SingletonDemo
{
  private static SingletonDemo mInstance;

  private SingletonDemo()
  {
  }

  public static SingletonDemo GetInstance()
  {
     if(mInstance == null)
       mInstance = new SingletonDemo();

     return mInstance;
  }

  // ...
  
  //Funktionsdefinitionen
}



Damit ist gewährleistet, dass es zur Laufzeit maximal eine Instance dieser Klasse geben kann. DAS ist das Singleton-Muster. Was Du beschreibst ist aus der Sicht der objektorientierten Programmierung (tut mir leid, dass ich es so sagen muss) Müll.
Das erinnert mich mehr an prozedurale Programmierung, nur dass Du eine Klasse missbrauchst um Prozeduren zu definieren.

Globale Variablen gibt es in C# nicht, Punkt aus basta. Wer globale Variablen (und die damit verbundenen Spaghetti-Code Strukturen) haben will, der soll gefälligst VB6 oder so verwenden.

Und selbst bei Deinem Beispiel sind die Variablen nicht von "überall" aus zugreifbar. Wenn Du in einem Projekt keinen Verweis auf die Assembly hast wo das Zeug drinsteckt kommste auch nicht dran. Mal von Namespaces ganz abgesehen...

Sorry, wollte Dich nicht niedermachen oder angreifen, aber ich hab mich lang genug mit VB6 rumgekloppt und bin froh, dass es endlich eine typsichere und rein objektorientierte Sprache wie C# gibt 🙂

"It is not wise to be wise" - Sun Tzu

D
DaJackel Themenstarter:in
6 Beiträge seit 2006
vor 18 Jahren

Danke für eure Antworten. Nachdem ich folgenden Artikel über Singleton gelesen habe überlege ich mir das vielleicht doch noch mal. Ich dachte eigentlich, dass ich mit einem Singleton Speicher spare und Performance gewinne, da ich dann oft genutzte Objekte nicht immer neu erstellen muss.

Naja, scheinbar macht ein Singleton mehr ärger als freude.

Hier ein interessanter Link: http://www.martin-fredrich.de/?page_id=4

S
8.746 Beiträge seit 2005
vor 18 Jahren

Zunächst: Es gibt keine globalen Variablen in C# (braucht man nicht in OO-Sprachen). Globale Variablen verführen zu schlechtem Design und damit zu unnötigen Fehlern.

Das Singleton hingegen ist ein Muster, welches immer nur eine Instanz eines Typs erlaubt. Das hat mit globalen Variablen erstmal wenig zu tun. Allerdings haben viele globale Variablen Singleton-Charakter (einmal initialisiert, dann nie mehr geändert).

Statische Variablen sind am ehesten als Ersatz für globalen Variablen verwendbar - wenn es denn sein muss.

4.207 Beiträge seit 2003
vor 18 Jahren

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

Q
992 Beiträge seit 2005
vor 18 Jahren

Das habeich mal aus dem von DaJackel zitierten Blog rausgeholt:

In DLLs lassen sich Singletons nur eingeschränkt verwenden. Da DLLs nicht wie zum Beispiel Libraries zum Programm gelinkt werden, sondern von Haus aus gelinkt sind, wird ein Singleton, das in einer DLL und dem Hauptprogramm verwendet wird, in beiden Modulen ein eigenes Objekt sein. Das kann man (umständlich) vermeiden, indem das Hauptprogramm die eigene Instanz des Singleton an die Dll übergibt.

Ist das so?
Ich dachte innerhalb einer Anwendungsdomäne wäre eine statische Instanz überall gleich.

Grüße, Christoph

4.207 Beiträge seit 2003
vor 18 Jahren

Innerhalb einer AppDomain existiert eine "Kopie" eines statischen Members. Lädst Du eine DLL aber beispielsweise in eine eigene AppDomain nach, was zwecks späterer Entladbarkeit nicht so realitätsfern ist, bekommt man unter Umständen Probleme.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

3.825 Beiträge seit 2006
vor 18 Jahren

Hallo cmpxchg,

genau sowas wie Dein Beispiel brauche ich. Leider funktionieren beide Beispiele nicht bei mir :

public class clsParameter
{
	// Globale Datenbank Variablen
	public static string database = "Kunden";
	public static string server   = "SERVER1";
}
...
clsParameter pa = new clsParameter();
string db = pa.database;

Es kommt der Fehler :
Auf den statischen Member "Application.clsParameter.database" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.

public static class clsParameter
{
	// Globale Datenbank Variablen
	public string database = "Kunden";
	public string server   = "SERVER1";
}

Es kommt der Fehler :
Instanzmember können nicht in einer statischen Klasse deklariert werden.

Ich benutze Dot.NET 2.0.

Vielleicht gibt es ja noch eine andere Möglichkeit für meine Anforderung als eine statische Klasse ?
Ich möchte beim Start einer Applikation Server und Datenbankname angeben, damit die gleiche Applikation mit verschiedenenn Datenbanken arbeiten kann. Auf beide Werte muss ich ja beim Zusammenbau des Connectionstrings zugreifen, und das kann irgendwo in der Applikation sein.
Geht sowas auch ohne globale Variablen ?

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

6.862 Beiträge seit 2003
vor 18 Jahren

*gg* Du machst das grad genau falsch rum 🙂

Bei deinem zweiten Beispiel hast du eine statische Klasse, also darfst du auch nur statische Member haben. Also mit dem Schlüsselwort static davor.

Beim ersten Beispiel hast du statische Member, aber du versuchst über die Instanz drauf zuzugreifen, was man nicht darf. Da musst du dann direkt schreiben


string db = clsParameter.database;

Baka wa shinanakya naoranai.

Mein XING Profil.

3.825 Beiträge seit 2006
vor 18 Jahren

Hallo Talla,

klappt jetzt !

Danke

Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3