1628 Stimmen

Wann sollte ich in C# eine Struktur anstelle einer Klasse verwenden?

Wann sollten Sie in C# struct und nicht class verwenden? Mein konzeptionelles Modell besagt, dass structs verwendet werden, wenn das Element nur eine Sammlung von Wertetypen ist. Eine Möglichkeit, sie alle logisch zu einem zusammenhängenden Ganzen zusammenzufassen.

Ich bin auf diese Regeln hier gestoßen:

  • Ein struct sollte einen einzigen Wert repräsentieren.
  • Ein struct sollte einen Speicherbedarf von weniger als 16 Bytes haben.
  • Ein struct sollte nach der Erstellung nicht verändert werden.

Funktionieren diese Regeln? Was bedeutet ein struct semantisch?

0 Stimmen

Ich kann nur dem ersten Punkt zustimmen, Strukturen werden zum Beispiel sehr häufig in der Spieleprogrammierung verwendet.

305 Stimmen

System.Drawing.Rectangle verletzt alle drei dieser Regeln.

3 Stimmen

Ja, nun gut, zumindest Teile davon. Ich weiß, dass es für Teile von Spielen verwendet wird, wie NWN2 World Creator. C ist in der Regel immer noch das Kernelement (Engine). XNA Game Studio, Google es :)

3voto

Vizu Punkte 1801

Lassen Sie mich ein weiteres Aspekt hinzufügen, neben dem häufig zitierten Leistungsunterschied, und das ist die Absicht, die Verwendung von Standardwerten offenzulegen.

Verwenden Sie keine Struktur, wenn die Standardwerte ihrer Felder keinen sinnvollen Standardwert des modellierten Konzepts darstellen.

Zum Beispiel.

  • Ein Farbe oder ein Punkt ergibt auch Sinn, wenn alle ihre Felder auf ihre Standardwerte gesetzt sind. RGB 0,0,0 ist eine vollkommen gute Farbe und auch (0,0) als Punkt in 2D.
  • Aber eine Adresse oder ein Personenname haben keinen sinnvollen Standardwert. Ich meine, kannst du mit einem Personenname umgehen, bei dem Vorname=null und Nachname=null sind?

Wenn Sie ein Konzept mit einer Klasse implementieren, können Sie bestimmte Invarianten erzwingen, z. B. dass eine Person einen Vor- und Nachnamen haben muss. Aber mit einer Struktur ist es immer möglich, eine Instanz mit allen ihren Feldern auf ihre Standardwerte zu erstellen.

Also, bei der Modellierung eines Konzepts, das keinen sinnvollen Standardwert hat, bevorzugen Sie eine Klasse. Die Benutzer Ihrer Klasse werden verstehen, dass null bedeutet, dass ein Personenname nicht angegeben ist, aber sie werden verwirrt sein, wenn Sie ihnen eine Personenname-Strukturinstanz mit allen ihren Eigenschaften auf null gesetzt geben.

(Gewöhnlicher Haftungsausschluss: Leistungsüberlegungen können diesen Ratschlag außer Kraft setzen. Wenn Sie Leistungsprobleme haben, messen Sie immer, bevor Sie über eine Lösung entscheiden. Versuchen Sie BenchmarkDotNet, es ist genial!)

2voto

Ich verwende selten eine Struktur für Dinge. Aber das bin nur ich. Es hängt davon ab, ob ich möchte, dass das Objekt null sein kann oder nicht.

Wie in anderen Antworten erwähnt, verwende ich Klassen für realistische Objekte. Ich habe auch die Einstellung, dass Strukturen für die Speicherung kleiner Datenmengen verwendet werden.

1voto

Brian Punkte 115257

Ich denke, eine gute erste Annäherung ist "niemals".

Ich denke, eine gute zweite Annäherung ist "niemals".

Wenn Sie verzweifelt nach Leistung sind, sollten Sie sie in Betracht ziehen, aber dann immer messen.

27 Stimmen

Ich würde mit dieser Antwort nicht übereinstimmen. Strukturen haben in vielen Szenarien eine legitime Verwendung. Hier ist ein Beispiel - das Marshalling von Daten zwischen Prozessen auf atomare Weise.

27 Stimmen

Du solltest deinen Post bearbeiten und deine Punkte ausführen - du hast deine Meinung geäußert, aber du solltest sie damit untermauern, warum du diese Meinung vertrittst.

4 Stimmen

Ich denke, sie brauchen eine Äquivalenz zur Totin' Chip-Karte (de.wikipedia.org/wiki/Totin%27_Chip) für die Verwendung von Strukturen. Ernsthaft.

0voto

logeshpalani31 Punkte 1292

ÜBERLEGEN Sie den Strukturanwendungsfall

  1. Erstellen Sie ein Objekt oder müssen Sie das Objekt nicht erstellen (Sie können direkt Werte zuweisen, es erstellt ein Objekt)
  2. Brauchen Sie Geschwindigkeit oder Leistungsverbesserung
  3. Keine Notwendigkeit für Konstruktoren und Destruktoren (Statischer Konstruktor vorhanden)
  4. Kein Bedarf an Klassenererbung, aber Schnittstellen sind akzeptabel
  5. Kleines Arbeitslastobjekt, bei hoher Arbeitslast werden Speicherprobleme auftreten
  6. Sie können Standardwerte für Variablen nicht festlegen.
  7. Struktur auch verfügbare Methoden, Ereignis, statischer Konstruktor, Variable usw.
  8. Weniger Arbeitslast im GC
  9. Kein Bedarf für Verweistypen, nur Werttypen (jedes Mal, wenn Sie ein neues Objekt erstellen)
  10. Kein unveränderliches Objekt (Zeichenfolge ist ein unveränderliches Objekt, weil bei jeder Operation ein neues Zeichenfolge zurückgegeben wird, ohne das Original zu ändern)

-12voto

Cryo Erger Punkte 53

Strukturen sind in den meisten Aspekten wie Klassen/Objekte. Eine Struktur kann Funktionen, Mitglieder enthalten und geerbt werden. Strukturen werden in C# jedoch nur zum Datenhalten verwendet. Strukturen verbrauchen weniger RAM als Klassen und sind einfacher für den Garbage Collector zu sammeln. Wenn Sie jedoch Funktionen in Ihrer Struktur verwenden, behandelt der Compiler diese Struktur tatsächlich sehr ähnlich wie eine Klasse/ein Objekt, also wenn Sie etwas mit Funktionen möchten, verwenden Sie Klasse/Objekte.

3 Stimmen

Strukturen können NICHT vererbt werden, siehe msdn.microsoft.com/en-us/library/0taef578.aspx

0 Stimmen

Ob etwas ein Struct ist oder nicht, hat keinen Einfluss darauf, wie einfach es vom Garbage Collector gesammelt werden kann. Das heißt, unter normalen Umständen wird ein Struct überhaupt nicht vom Garbage Collector gesammelt - weil es nicht auf dem Heap allokiert wird. Allerdings bedeutet dies nicht, dass es niemals auf dem Heap allokiert wird, auch wenn es ein Struct ist. Wenn es geboxed ist oder wenn es ein Mitglied eines Verweistyps ist, wird es auf dem Heap allokiert. Aber sobald es auf dem Heap allokiert ist, wird es vom Garbage Collector genauso behandelt wie jeder andere Verweistyp - es ist nicht einfacher zu sammeln als jeder andere Typ.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X