C# - static class

Diskutiere C# - static class im Developer Network Forum im Bereich Hardware & Software Forum; Hallo, ich habe momentan 2 anliegen an denen ich schon eine weile bastle. nur komme ich nicht dahinter. nun habe ich etwas bombeneinfaches...
  • C# - static class Beitrag #1
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Hallo,

ich habe momentan 2 anliegen an denen ich schon eine weile bastle.
nur komme ich nicht dahinter.
nun habe ich etwas bombeneinfaches erstellt und komm acuh ned drauf^^

punkt 1:

was ist der unterschied von:

Code:
using System;

namespace Home
{
    public class test
    {
        static test()
        {
            System.Console.WriteLine("Static Constructor");
        }
        public static void tester()
        {
            System.Console.WriteLine("Main");
        }
    }
}

und dem


Code:
using System;

namespace Home
{
    public [COLOR="Red"]static [/COLOR]class test
    {
        static test()
        {
            System.Console.WriteLine("Static Constructor");
        }
        public static void tester()
        {
            System.Console.WriteLine("Main");
        }
    }
}

funktioniert beides gleich, aber woran liegt der unterschied?

Punkt 2:
wie baue ich da einen destructor ein?


folgendes lässt sich zwar kompilieren und ausführen, aber er läuft den destructor nicht durch?

Code:
using System;

namespace Home
{
    public class test
    {
        static test()
        {
            System.Console.WriteLine("Static Constructor");
        }
        ~test()
        {
            System.Console.WriteLine("Static Destructor");
        }
        public static void tester()
        {
            System.Console.WriteLine("Main");
        }
    }
}

herzlichen dank im vorhinein.
habe extra schnell eine einfache klasse erstellt, da die Klasse an der ich momentan Arbeite einfach zu kompliziert ist und ich mir teilweise schwer tu die sachen immer gleich nachvollziehen zu können.

Prinzipiell passt die klasse perfekt nur eben der destructor ist mein problem, denn wenn er den nicht durchrennt, geht mir vielleicht der Server in die Knie...

axel
 
  • C# - static class Beitrag #2
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

ich "kann" zwar nur java aber das ist recht aehnlich dem C#. Von daher versuche ich mal eine Erklaerung abzugeben (2. weiss ich nicht, da es in java keine destructoren gibt):

Zu 1.) Wenn eine Klasse und deren Methoden static sind, kannst Du sie ohne eine Instanz davon zu bilden aufrufen. Das bedeutet, dass Du von der statischen Klasse die Methode "tester()" einfach mit "test.tester()" aus einer anderen Klasse aufrufen kannst. Wenn Du eine Klasse als "static" deklarierst, muessen alle ihrer Methoden auch "static" sein.

Zu 2.) koennte ich mir vorstellen, dass der destructor erst dann durchlaufen wird, wenn es wirklich keine Referenz mehr auf diese Klasse gibt bzw. wenn die Laufzeitumgebung (in java macht das da der garbage collector) diese "wegraeumen" will. In java hat man grundsaetzlich keinen Einfluss auf den Zeitpunkt des Aufraeumens - keine Ahnung, wie das in C# ist.

Gruss, FFNB.
 
  • C# - static class Beitrag #3
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Wenn Du eine Klasse als static deklarierst, dann heißt das, daß alle ihre Member ebenfalls static sind. Zudem kannst Du keine Instanz einer static class erzeugen.

Zum Destructor: Hast Du auch eine Instanz Deiner Testklasse erzeugt? Andernfalls muß der Destruktor auch nicht aufgerufen werden.
Allerdings sind Destruktoren in C# nicht mit denen von C++ zu vergleichen. In C++ ist der Aufruf des Destruktors zeitlich genau definiert. Nämlich genau dann, wenn das Objekt seinen Geltungsbereich verläßt und zerstört wird. In C# werden Objekte allerdings nicht sofort zerstört, sondern erst dann, wenn der GC wieder Platz für neue Objekte benötigt. Das kann sofort sein, oder auch nie. Du kannst den GC mit "System.GC.Collect()" auch dazu zwingen, nicht mehr benötigte Objekte sofort wegzuräumen.

Edit: Da war ich wohl zu langsam ;-)
 
  • C# - static class Beitrag #4
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
  • C# - static class Beitrag #5
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Danke erstmals :)

Code:
using System;

namespace Home
{
    public class test
    {
        private static readonly test instance = null;

        static test()
        {
            System.Console.WriteLine("Static Constructor");
            instance = new test();
        }
        ~test()
        {
            System.Console.WriteLine("Static Destructor");
        }
        public static void tester()
        {
            System.Console.WriteLine("Main");
        }
    }
}


das rufe ich von einer anderen Klasse mit "test.tester()" auf, ich initialisiere aber vorher kein objekt sondern ruf das direkt mit einem button 2x auf.
ergebnis:
Static Constructor
Main
Main
Static Destructor
funktioniert perfekt :D, ist genau das was ich wollte.

nur 2 logische fragen.
1) wann wird die klasse test initialisiert, erst dann, wenn ich darauf zugreife?
2)
Code:
private static readonly test instance = null;
was passiert damit genau?

danke
axel
 
  • C# - static class Beitrag #6
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
1. Der statische Konstruktor wird aufgerufen, wenn Du das erste mal auf das Objekt zugreifst. In Deinem Konstruktor generierst Du auch eine Instanz per new. Deshalb wird auch der Destruktor am Ende aufgerufen. Einen statischen Destruktor gibt es nicht.
2. Du initialisierst eine statische Variable das Klasse test mit null. Wenn Du über diese Variable versuchst, auf Test zuzugreifen, dann gibt's einen Fehler.
 
  • C# - static class Beitrag #7
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
Danke
Wobei punkt 2 habe ich nicht ganz verstanden, initialisiere ich da nciht eigentlich 2 mal die klasse?

axel
 
  • C# - static class Beitrag #8
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Danke
Wobei punkt 2 habe ich nicht ganz verstanden, initialisiere ich da nciht eigentlich 2 mal die klasse?
Nein, hier wird gar keine Klasse initialisiert. Die Variable "instance" enthält nur eine Referenz auf eine Instanz der Klasse test oder in Deinem Fall null. Das ist sozusagen eine Null-Referenz. Wenn Du versuchst, darüber auf die (nicht existierende) Instanz zuzugreifen, gibt's eine Null-Pointer-Exception.

Damit das klappt mußt Du statt null mit new eine neue Instanz erzeugen und zuweisen.
 
  • C# - static class Beitrag #9
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
ok, das verstehe ich nun.

aber beim inizialisieren der klasse, initialisiere ich ja auch die instanz.
wäre das dann keine endlosschleife?

Code:
static test()
        {
            System.Console.WriteLine("Static Constructor");
            instance = new test();
        }

axel
 
  • C# - static class Beitrag #10
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
ok, das verstehe ich nun.

aber beim inizialisieren der klasse, initialisiere ich ja auch die instanz.
wäre das dann keine endlosschleife?

Code:
static test()
        {
            System.Console.WriteLine("Static Constructor");
            instance = new test();
        }
axel
Nein, da der statische Konstruktor beim new nicht mehr aufgerufen wird. Wäre das ein Instanz-Konstruktor (ohne static), dann hättest Du recht und das Ergebnis wäre zwar keine Endlosschleife, sondern ein Stack Overflow (= Stack ist voll).
 
  • C# - static class Beitrag #11
A

axel_foley

Bekanntes Mitglied
Dabei seit
02.05.2007
Beiträge
130
Reaktionspunkte
0
ah, verstehe, eigentlich hätte es mir ja von verherein logisch sein sollen^^
trotzdem danke :D
(perfekt, du wusstest gleich was ich mir dachte :D)

wenn wir schon bei statischen klassen sind.
ich habe eine statische klasse, die genau nach dem Prinzip aufgebaut ist, es geht halt darum auf Access zuzugreifen.
1 mal Querry ausführen, dann scalar zurückgegben und einmal dataset ausfüllen.
Die Klasse funktioniert einwandfrei.

ich erstelle eine neue Access - DB. dann die tables(inkl. Primary Keys) und auch die Foreign Keys. Funktioniert tadellos.
ich habe nur ein problem. wenn ich über das Querry einen Index erstellen möchte, dann funktioniert es einmal und einmal nicht.
Der Programmcode rennt immer fehlerfrei durch.
nur wenn ich in die Access - DB reingucke, ist einmal auf der spallte ein index drauf und einmal nicht. Unterschiedlich von erstellung zu erstellung. Aber selbst wenn auf manchen spallten zufällig ein index liegt, muss nicht auf jeder spalte ein index liegen, wo ich ihn angelegt habe.

Indexnamen sind 100% unterschiedlich, wird immer mit "i" + tablename + columnname deklariert

hat jemand eine idee?

axel
 
Thema:

C# - static class

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben