| 

.NET C# Java Javascript Exception

10
Ebenso wie in herkömmlichen Klassen, können auch benutzerdefinierte Strukturen (structure) Methoden oder auch Eigenschaften enthalten und definieren. Beide Typen werden werden via New/new neu instanziiert. Wo liegt der eigentliche Unterschied und wann sollte welcher Typ - also Klasse oder Struktur - bevorzugt verwendet werden?
News:
19.01.2012
1paket.com 71 2 3
2
Hi 1paket, wär eine oder mehre Antworten hilfreich oder nützlich? Wenn ja bewerte diese doch bitte und ggf. kannst du eine auch als besonders hilfreich markieren.
Floyd 20.01.2012
3 Antworten
6
Der große Unterschied ist das Structs Value-Types und Klassen Reference-Types sind.

Der Unterschied zwischen Value-Types und Reference-Types liegt darin, dass Value-Types die tatsächlichen Daten enthalten und Reference-Types nur eine Referenz (also eine Speicheradresse) zu den Daten enthalten. Das ist das wichtig wenn man Variablen als Funktionsparameter mitgibt die nicht als "ref" deklariert sind. Hier wird eine Kopie der Daten angelegt so das Änderungen an Value-Types sich nur innerhalb der Funktion auswirken. Änderungen an Reference-Types enthalten aber nur die Referenzen auf die Speicheradressen wodruch sich Änderungen an den Daten auf alle Instanzen der Klasse auswirken.

Ein Beispiel:

public struct A{
public int B;
}

public void Modifiy(A a){
a.B = 2;
}

var a = new A();
a.B = 1;
Modifiy(a);
Console.WriteLine(a.B); // = 1

public class A{
public int B;
}

public void Modifiy(A a){
a.B = 2;
}

var a = new A();
a.B = 1;
Modifiy(a);
Console.WriteLine(a.B); // = 2


Der zweite wesentliche Unterschied ist das Struct's wenn dann einen parametrierten Konstruktor aufweisen müssen. Klassen hingegen müssen über einen parameterlosen Konstruktor verfügen. Es ist nicht möglich einen parameterlosen Konstruktor für einen Value-Type zu erzeugen oder diesen zu überschrieben (Warum? es gibt ihn einfach nicht). Schaut man sich die Spezifikationen von C# im Vergleich zur CLI an, so sieht man das C# zwar einen parameterlosen Konstruktor für Structuren vorsieht, dieser aber in der CLI-Spec nicht aufgeführt wird. Aus diesem Grund kann man mittels Reflection auch nicht den parameterlosen Konstruktor einer Struct / eines Value-Types ermitteln oder zugreifen.

Desweiteren können Structuren nicht vererbet werden und es gibt auch keine abstracten Structs. In diesem Fall verhalten sich Struct's wie sealed Klassen.

In der MSDN gibt es zu deiner eigentlichen Frage eine gute Zusammenfassung:
Consider defining a structure instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

Do not define a structure unless the type has all of the following characteristics:

It logically represents a single value, similar to primitive types (integer, double, and so on).
It has an instance size smaller than 16 bytes.
It is immutable.
It will not have to be boxed frequently.

Quelle: Choosing Between Classes and Structures (EN) / Auswählen zwischen Klassen und Strukturen (DE)

Strukturen also für einfachen, primitive Datentypen wie string, int, double etc. oder als kurzfristige Datenhalde verwenden.
Strukturen werden aber oft auch für die Serial Communications und COM Interaction benötigt. Zum Beispiel für API-Zugriffe.
19.01.2012
Floyd 14,6k 3 9
Floyd 14,6k 3 9
3
Ich habe über Google folgenden interessanten Link zu Google books gefunden. Michael Kofler schreibt das ganz schön. Zusammengefasst: Eine Klasse arbeitet, eine Struktur verwaltet die ihr anvertrauten Variablen.

http://books.google.de/books?id=aeQU0Hovu4EC&pg=PA242&lpg=PA242&dq=vb.net+unterschied+structure+klasse&source=bl&ots=P_BrfEbLSq&sig=xdgRSr9LpNHBUJ154UXkKzmM1-8&hl=de&sa=X&ei=7zgYT7WsFI_Pswa6kumXDQ&ved=0CCcQ6AEwAQ#v=onepage&q=vb.net%20unterschied%20structure%20klasse&f=false

Edit: Einen Link noch direkt zu Microsoft:
http://msdn.microsoft.com/de-de/library/2hkbth2a%28v=VS.100%29.aspx
19.01.2012
muffi 1,4k 1 9
muffi 1,4k 1 9
2
Der große Unterschied ist, das structs Werttypen darstellen. Eine Variable von einem Struct-Typ repräsentiert die Werte der Instanz an sich, nicht eine Referenz auf den Speicherbereich, wo die Werte stehen. Am besten wird das mit etwas Beispielcode klar:

static void Main(string[] args)
{
Struct s1 = new Struct();
Console.WriteLine(s1.Value); //0
Class c1 = new Class();
Console.WriteLine(c1.Value); //0
Struct s2 = s1;
//kompiliert nicht: s2 = null;
Class c2 = c1;
s1.Value = 42;
c1.Value = 42;
Console.WriteLine(s2.Value); //0
Console.WriteLine(c2.Value); //42
//kompiliert nicht: Console.WriteLine(s1 == s2);
Console.WriteLine(c1 == c2); //true
Console.WriteLine(s1.Equals(s2)); //false
s1.Value = 0;
Console.WriteLine(s1.Equals(s2)); //true
Console.WriteLine(c1.Equals(c2)); //true


ChangeStruct(ref s1, s2);
ChangeClass(ref c1, c2);
Console.WriteLine("{0} {1} {2} {3}", s1.Value, s2.Value, c1.Value, c2.Value); //4711 0 815 815
c2 = new Class();
ChangeClass(ref c1, c2);
Console.WriteLine("{0} {1} {2} {3}", s1.Value, s2.Value, c1.Value, c2.Value); //4711 0 4711 815

s2 = s1;
c2 = c1;
ChangeStruct(ref s2);
ChangeClass(ref c2);
Console.WriteLine("{0} {1} {2} {3}", s1.Value, s2.Value, c1.Value, c2.Value); //4711 23 4711 23
Console.WriteLine(c1 == c2); //false
}

static void ChangeStruct(ref Struct s1, Struct s2)
{
s1.Value = 4711;
s2.Value = 815;
}

static void ChangeStruct(ref Struct s1)
{
s1 = new Struct() { Value = 23 };
}

static void ChangeClass(ref Class c1, Class c2)
{
c1.Value = 4711;
c2.Value = 815;
}

static void ChangeClass(ref Class c1)
{
c1 = new Class() { Value = 23 };
}


Generell Empfehlungen zum Einsatz sind schwierig. In der Regel nehme ich Klassen. Eine struct kommt dann in Frage, wenn es für alle Felder einen sinnvollen Default-Wert gibt und es wichtig oder zumindest angenehm ist, dass es keine NULL-Referenzen für den Typ geben kann. System.Nullable<T> ist dafür ein Paradebeispiel. Wer das letzte aus dem Spiecher herausholen muss, den wird vielleicht auch interessieren, dass structs manchmal(!) weniger Platz beanspruchen, weil die 4 oder 8 Byte für den Pointer entfallen.
19.01.2012
Matthias Hlawatsch 13,2k 4 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH