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?
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
Danke, jetzt habe ich wenigstens einen Begriff wonach ich suchen kann.
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
@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
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
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.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
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
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
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
*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.
Hallo Talla,
klappt jetzt !
Danke
Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3