Archiv verlassen und diese Seite im Standarddesign anzeigen : Klassen-Konstruktor
broetchen
27.07.2004, 11:34
moin
was ein Konstruktor ist, weiss ich.
Nur, gibt es sowas wie einen Konstruktor für die Klasse?
z.B.: ich hab in einer DB-Klasse die Connection als private static.
toll, sie ist da, aber kann ich es irgendwie machen, dass er die connection öffnet wenn die klasse geladen wird, und nicht nur anlegt??
mfg broetchen
Cord Worthmann
27.07.2004, 16:05
machste so...
public class Conn
{
private static IDbConnection conn = ....;
public Conn()
{
conn.Open();
}
}
grtz
chief
Wieso ist die Connection als private static deklariert? Willst du nur statisch auf die Klasse zugreifen, also so: DBKlasse.connection ? Bei statischen Klassen gibts dann ja auch keinen Konstruktor, dann bräuchtest du eine Methode, die dir die Verbindung öffnet. Andernfalls mach es so wie vom Chief vorgeschlagen.
broetchen
28.07.2004, 08:14
moin
jupp, die ganzen methoden sind static.
also DBConn.Funktion();
nur wird die Connection in jedem Funktionsaufruf geöffnet und am Ende wieder geschlossen, und kommt mir irgendwie überflüssig vor.
daher wollte ich wissen, ob ich es irgendwie so machen kann, dass die Connection beim Laden der Klasse geöffnet werden kann.
Immerhin wird sie ja beim Laden der Klasse angelegt, also ist es wohl nicht zu weit hergeholt, dass das geht, oder??
mfg broetchen
Wie gesagt, wenn die Klasse statisch ist, gibt es keinen Konstruktor -> die Klasse wird nicht "geladen". Du greifst nur statisch darauf zu. Also könntest du eine Open() und eine Close() Methode schreiben, die du nach jeder Operation aufrufst.
broetchen
28.07.2004, 10:14
diese Open() und Close()-Methode wird schon ausgeführt.
also werd ichs lassen wie es ist.
wäre trotzdem lustig gewesen sowas mal zu schreiben
thx
mfg broetchen
Du könntest natürlich auch eine nicht statische Klasse schreiben. In dem Konstruktor machst du dann ein Open() und im Destruktor ein Close(). Wäre vielleicht ganz sinnvoll. Ausserdem kannste dann auch im Destruktor offene Transaktionen commiten.
Pulpapex
05.08.2004, 22:44
Hi,
es gibt übrigens auch statische Konstruktoren.
public class Conn {
private static IDbConnection conn = ....;
public static Conn() {
conn.Open();
}
}Statische Konstruktoren werden beim ersten Zugriff auf die Klasse ausgeführt. Also genau das was du haben wolltest.
Andererseits ... viel mit statischen Feldern und Methoden zu arbeiten, ist keine gute Idee. Denn dadurch wird quasi die Objekt-Orientierung ausgehebelt. U.a. Ableiten und Überschreiben ist dann nicht mehr möglich.
Guck dir mal das Singleton-Pattern an. Eine bewährte Lösung für genau dieses Problem.
Gruß
Pulpapex
hi!
Hi,
es gibt übrigens auch statische Konstruktoren.
Code:
public class Conn {
private static IDbConnection conn = ....;
public static Conn() {
conn.Open();
}
}
]
Statische Konstruktoren werden beim ersten Zugriff auf die Klasse ausgeführt. Also genau das was du haben wolltest.
Andererseits ... viel mit statischen Feldern und Methoden zu arbeiten, ist keine gute Idee. Denn dadurch wird quasi die Objekt-Orientierung ausgehebelt. U.a. Ableiten und Überschreiben ist dann nicht mehr möglich.
Guck dir mal das Singleton-Pattern an. Eine bewährte Lösung für genau dieses Problem.
Gruß
Pulpapex
ich habe noch nie etwas von statischen konstruktoren gehört. ich habe in büchern dazu nichts gefunden, aber auf der microsoft-site. aber das scheint doch noch etwas anderes zu sein als das code-beispiel aus dem zitat (siehe oben).
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfSystemCodeDomCodeTypeConstructorClassTopic.asp
was soll also ein statischer konstruktor sein? was kann man damit erreichen?
@pulpapex
könntest du vielleicht mal einen link zu einem beispiel posten oder selbst ein beispiel schreiben?
gruß,
*Caesar*
D. Posch
06.08.2004, 01:16
Statische Konstruktoren gibt es nicht. Überleg mal, wozu solltest du einen Konstruktor aufrufen können ohne eine Instanz einer Klasse anzulegen? Ein Kostruktor ist dazu da, um Klassenelemente vor dem Gebrauch zu initalisieren. Mit einer statischen Methode bzw. mit einem 'statischen Konstruktor' wäre das erstens gar nicht möglich und zweitens geht der Sinn verloren.
Abgesehen davon sind im Konstruktor, wie auch im Destruktor, sowieso keine Access-Modifiers erlaubt, also kann es gar keine statischen Konstruktoren geben. ;)
Pulpapex
07.08.2004, 17:19
Ein statischer Konstruktor wird wie gesagt beim ersten Zugriff auf eine Klasse ausgeführt. Das kann der Zugriff auf einen statischen Klassen-Member oder ein Konstruktor-Aufruf sein.
Gebrauchen kann man sowas z.B., wenn ein statisches Feld nicht in einer Code-Zeile instanziiert und initialisiert werden kann.
Beispiel:public struct Info {
public string A;
public int B;
}
public class StaticConstructorTest {
// kann nicht in einer Code-Zeile initialisiert werden.
private static Info Info;
static StaticConstructorTest() {
// Info-Member initialisieren.
Info = new Info();
Info.A = "Test";
Info.B = 1;
}
public static void Main() {
// Info.A abfragen und ausgeben.
// Dabei wird implizit der statische Konstruktor aufgerufen.
string a = StaticConstructorTest.Info.A;
Console.WriteLine(a);
}
}Natürlich kann man das auch anders lösen (Info-Konstruktor schreiben), aber soll ja nur ein Beispiel sein.
Genaueres findet ihr hier:
C# Programmiersprachenspezifikation - 10.11 statische Konstruktoren (http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/csspec/html/vclrfcsharpspec_10_11.asp)
Bemerkung: Das ist ein Kapitel aus der .Net Framework Doku, die jeder auch lokal auf der Platte hat.
@Posch: da könntest du mal reingucken, von wegen Konstuktoren erlauben keine Zugriffsmodifizierer.
Hmm, ziemlich irrsinnige Neuerung, find ich.
Pulpapex
07.08.2004, 21:14
Das ist keine Neuerung. Es ist ganz normales C# seit .Net 1.0/1.1.
Aber es ist eine Neuerung. Wo gibts denn sonst noch statische Konstruktoren? Und vorallem, wer braucht sowas?
Pulpapex
08.08.2004, 16:14
In Java gibt es das auch. Dort nennt sich das static-Block. Man kann in einer Klasse ausserhalb von Methoden static-Blöcke definieren, die genauso beim ersten Klassenzugriff ausgeführt werden.
Beispiel, I18N-Ressourcen laden:public class JavaStatic {
private static ResourceBundle res;
private static String versionInfo;
static {
try {
res = ResourceBundle.getBundle("appRessources");
versionInfo = res.getProperty("versionInfo");
} catch(IOException ex) {
versionInfo = "[Unbekannt]";
}
}
}
broetchen
10.08.2004, 11:47
moin
natürlich kann man sowas brauchen, wenn du eben gewisse sachen erledigen musst, die die klasse und nicht die einzelnen instanzen betreffen.
z.B.: eine statische connection zu öffnen
kann man neben dem statischen konstruktor auch normale konstruktoren fahren?? sodass man auch instanzen anlegen kann...
mfg broetchen
hi!
ich hab mir den link mal angesehen, den Pulpapex gepostet hatte. dort wird erklärt, daß der statische konstruktor nicht direkt aufgerufen werden kann (!). das bedeutet, daß keine (!) "connection irgendwie" damit erzeugt werden kann. Sondern: dieser konstruktor wird ausgeführt, damit statische methoden, die teil einer klasse sind, auch direkt ausgeführt werden können, ohne daß zunächst eine instanz gebildet werden muß.
sowas hatte ich mir auch schon gedacht. auf jeden fall noch mal besten dank an Pulpapex.
gruß,
*Caesar*
broetchen
11.08.2004, 00:10
moin
genau so etwas habe ich auch gesucht!
nur blöd, dass mein praktikum schon vorbei ist und ich den code nicht mehr ändern kann :D
auf jeden fall vielen dank an Pulpaplex
mfg broetchen
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.