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 :)

6voto

N_E Punkte 729

Ich habe gerade mit Windows Communication Foundation [WCF] Named Pipe gearbeitet und festgestellt, dass es sinnvoll ist, Strukturen zu verwenden, um sicherzustellen, dass der Datenaustausch vom Werttyp anstelle des Referenztyps ist.

1 Stimmen

Dies ist meiner Meinung nach der beste Hinweis von allen.

5voto

akardon Punkte 36762

Kurz gesagt, verwenden Sie struct, wenn:

  1. Ihre Objekteigenschaften/Felder nicht geändert werden müssen. Das heißt, Sie möchten ihnen nur einen Anfangswert geben und sie dann lesen.

  2. Eigenschaften und Felder in Ihrem Objekt sind Werttypen und sie sind nicht so groß.

Wenn das der Fall ist, können Sie die Vorteile von structs für eine bessere Leistung und optimierte Speicherzuweisung nutzen, da sie nur Stacks anstatt sowohl Stacks als auch Heaps verwenden (bei Klassen)

4voto

Saeed Dini Punkte 125

Die C# Struktur ist eine leichtgewichtige Alternative zu einer Klasse. Sie kann fast dasselbe wie eine Klasse tun, aber es ist "billiger", eine Struktur statt einer Klasse zu verwenden. Der Grund dafür ist etwas technisch, aber zusammengefasst werden neue Instanzen einer Klasse auf dem Heap platziert, während neu instanziierte Strukturen auf dem Stack platziert werden. Außerdem arbeiten Sie nicht mit Verweisen auf Strukturen wie bei Klassen, sondern stattdessen arbeiten Sie direkt mit der Strukturinstanz. Dies bedeutet auch, dass wenn Sie eine Struktur an eine Funktion übergeben, dies per Wert geschieht, anstatt als Verweis. Weitere Informationen hierzu finden Sie im Kapitel über Funktionsparameter.

Sie sollten also Strukturen verwenden, wenn Sie einfachere Datenstrukturen darstellen möchten, insbesondere wenn Sie wissen, dass Sie viele Instanzen davon instanziieren werden. Es gibt viele Beispiele im .NET-Framework, in denen Microsoft anstelle von Klassen Strukturen verwendet hat, z.B. die Strukturen Point, Rectangle und Color.

4voto

Rupesh Punkte 495

Folgend sind die Regeln definiert auf der Microsoft-Website:

ERWÄGEN Sie die Definition einer Struktur statt einer Klasse, wenn Instanzen des Typs klein und häufig kurzlebig sind oder häufig in anderen Objekten eingebettet sind.

VERMEIDEN Sie die Definition einer Struktur, es sei denn, der Typ hat alle der folgenden Merkmale:

Er stellt logisch einen einzelnen Wert dar, ähnlich wie primitive Typen (int, double, etc.).

Er hat eine Instanzgröße unter 16 Bytes.

Er ist unveränderlich.

Er muss nicht häufig verpackt werden.

für weitere Informationen

1 Stimmen

Diese Antwort scheint nur eine Wiederholung von (Teil von) dieser vorhandenen Antwort zu sein.

3voto

Rabbit Punkte 1681

Struct kann verwendet werden, um die Leistung der Garbage Collection zu verbessern. Obwohl Sie sich normalerweise keine Gedanken über die Leistung der GC machen müssen, gibt es Szenarien, in denen sie problematisch sein kann. Wie z.B. große Caches in Anwendungen mit niedriger Latenz. Siehe diesen Beitrag für ein Beispiel:

http://00sharp.wordpress.com/2013/07/03/a-case-for-the-struct/

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