Quote:
Originally Posted by Logtetsch
Wieso kann man in C# die member einer struct nicht direkt "vorinitialisieren"? Dass ich mich damit einfach abfinden muss, ist mir klar, allerdings würde es mich interessieren, ob es hierfür einen gewissen Hintergrund gibt? Bringt diese Regel irgendwelche Vorteile mit sich? Hängt es vielleicht damit zusammen, dass struct ein Value-Type ist und die CLR den content meines Objektes beim Erstellen (mit new, oder nicht) sowieso auf ihre default-Werte setzt?
Code:
struct Foo
{
//Compiler Fehler
int sample = 5;
//Korrekt
int sample;
}
|
Korrekt. Am Anfang einer Methode wird der Stackframe mit 0en vorinitialisiert. Struct-Objekte landen auf dem Stack. Daher hat eine Struct alle Felder mit 0/null vorinitialisiert und das kannst du nicht anpassen.
Der Grund ist übrigens höchstwahrscheinlich die Performance. Den Stack mit 0en auffüllen zu können ohne irgendwelche etwaigen custom Konstruktoren von manchen Valuetype-Objekten beachten zu müssen ist schneller und erlaubt mehr Optimierungen.
Quote:
Originally Posted by Logtetsch
Da hast du etwas missverstanden. Mir geht es hierbei um das setzen von Feldern, noch bevor der Konstruktor aufgerufen wird. Bei Klassen funktioniert es ausgezeichnet.
Code:
struct Foo1
{
//Compiler Fehler
int sample = 5;
}
class Foo2
{
//Alles OK
int sample = 5;
}
|
Die Lazy-Initialization ist nur eine kürzere Schreibweise dafür, die Felder im Konstruktor zu initialisieren. Es ist dasselbe Prinzip und deshalb gelten dieselben Einschränkungen.
Quote:
Originally Posted by warfley
Für so etwas bietet C# doch den Konstruktor von Structs, ich denke dass es deshalb nicht in die Sprache implementiert wurde.
|
Nein. Bei Structs lässt sich kein eigener Standardkonstruktor definieren.
Quote:
Die Frage die man sich nun allerdings stellen sollte ist, wie sinnvoll ist es überhaupt Structs in C# zu verwenden, bis auf die Referenzsemantik sehe ich da eigentlich keinen Unterschied mehr zwischen Structs und Klassen.
Klar haben sie eine Exsistenzberechtigung (z.B. um mit DLL's die in anderen Sprachen geschrieben wurden zu kommunizieren) aber ansonsten sehe ich keinen wirklichen Vorteil
|
Das hat absolut nichts mit der Interaktion mit anderen Sprachen zu tun (C# Structs sind keine C Structs). Warum/wann man Structs haben wollen könnte? Eben dann, wenn man einen Valuetype möchte. Solche Objekte/Variablen landen auf dem Stack, werden kopiert (anstatt dass eine Referenz übergeben wird), können nicht den Wert null haben und logischerweise ist die standardmäßige Vergleichsmethode eben auch ein Vergleich des Objektinhalts anstatt der Referenz (== vergleicht die Werte der Felder des Objekts).
Wenn du solche Eigenschaften brauchst, nimmst du eine Struct. Im Grunde nimmt man das, um eigene "primitive" Typen zu definieren (Guid ist z.B. eine Struct).