Frage

Ich habe einen Typ, den ich als Struktur betrachte.

  • Es repräsentiert Einzelwert
  • Es ist unveränderlich

Das Problem ist jedoch, dass es 6 Felder von int hat.

Welche Lösung sollte ich für diesen Typ verwenden?

  1. Struktur weiter verwenden?
  2. Wechsel zum Unterricht?
  3. oder Pack 6 Ganzzahlen in eine Reihe von INT, so dass es nur ein Feld hat

BEARBEITEN

Die Größe der Struktur mit 6 Ganzzahlfeldern beträgt 24 Bytes, die riesig sind, um herumzugehen. Empfehlen Sie die Größe für Struktur beträgt nicht mehr als 16 Bytes

War es hilfreich?

Lösung

Es kommt darauf an, wie Sie es verwenden werden?

  1. Wirst du viel davon gegen viel davon vergeben?
  2. Wird es vom Code von Drittanbietern konsumiert? In diesem Fall bieten Ihnen Klassen in der Regel mehr Flexibilität.
  3. Möchten Sie Struct vs. Klassensemantik? Zum Beispiel nicht nullbar?
  4. Würden Sie davon profitieren, ein paar vorgefertigte Fälle dieser Klasse zu haben, die wiederverwendet werden können, um Sonderfälle zu repräsentieren? Ähnlich wie String.Empty. In diesem Fall würden Sie von einer Klasse profitieren.

Es ist schwierig, nur aus den Informationen zu beantworten, die Sie in Ihrer Frage angegeben haben.

Andere Tipps

Achten Sie auf das Boxen. Wenn Ihre Struktur von einer Methode konsumiert wird, die ein Objekt erwartet, wird sie zu einem Objekt gezwungen und Sie haben einen potenziellen Leistungsakt.

Hier ist ein Hinweis Das erklärt es ausführlicher.

Ich würde es zu einer Klasse machen (#2) und dann müssten Sie sich keine Sorgen machen.

Die Verwendung einer Reihe von sechs Ganzzahlen (#3) würde Ihren Code wahrscheinlich schwerer zu lesen machen. Eine Klasse mit beschreibenden Kennungen für jeden INT wäre viel besser.

Ohne Ihre Struktur zu sehen, ist es schwierig, irgendetwas definitiv zu sagen. Aber ich vermute, Sie sollten dies als Struktur verlassen.

Wie wäre es mit einer WriteOnce<int[]> ?

Ich würde vorschlagen, ein wenig Benchmark zu schreiben, um die Leistung der verschiedenen Optionen zu messen. Dies ist die einzige Möglichkeit, sicher zu wissen. Sie können über die Ergebnisse überrascht sein (ich bin oft).

(Ich gehe davon aus, dass Ihre Besorgnis hier die Leistung ist.)

Wenn der Datenhalter unveränderlich sein wird, hängt die struktur-gegen-Klasse-Frage höchstwahrscheinlich von der durchschnittlichen Anzahl von Referenzen ab, die für jede Instanz vorhanden sind. Wenn man ein Array von vierundzwanzig Jahren entspricht [1000], wird dieses Array 24.000 Bytes einnehmen, unabhängig davon, ob jedes Element einen anderen Wert hat, haben alle Elemente den gleichen Wert oder irgendwo dazwischen. Wenn man eine Auswahl von vierundzwanzig Jahren [1000] hat, wird dieses Array 4.000 oder 8.000 Bytes (für 32/64-Bit-Systeme) einnehmen, und jede eindeutige Instanz von vierundzwanziger Erzeugung wird etwa 48 Bytes dauern. Wenn alle Array -Elemente einen Hinweis auf das gleiche Vierundzwanzigbyteclass -Objekt enthalten, beträgt die Gesamtsumme 4.048 oder 8.048 Bytes. Wenn alle Array -Elemente Verweise auf verschiedene vierundzwanzig -Fourbyteclass -Objekte enthalten, beträgt die Gesamtsumme 52.000 oder 56.000 Bytes.

Bei der Laufzeitleistung ist die beste Leistung, die Sie erhalten können, im Allgemeinen Strukturen durch Bezugnahme. Das Besttungsstrukturen nach Wert erfordert das Kopieren, was für Strukturen von mehr als 16 Bytes teuer werden kann (.NET enthält Optimierungen für Strukturen 16 Bytes oder kleiner), aber die Kosten eines Werttyps durch Referenz sind gleich, unabhängig davon, ob es sich 16.000 Bytes.

Im Allgemeinen mache ich beim Speichern von mehr als zwei Teilen verwandter Daten gerne eine Klasse, die sie zusammenbindet. Vor allem, wenn ich sie als Einheit herumgeben werde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top