PDA

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

Scavi
27.07.2004, 16:19
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

Scavi
28.07.2004, 10:06
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

Scavi
30.07.2004, 15:11
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

Caesar
06.08.2004, 00:42
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.

Scavi
07.08.2004, 20:16
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.

Scavi
08.08.2004, 14:46
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

Caesar
10.08.2004, 18:32
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