C # Struct Verwendungstipps?

7

Ich benutze sehr gerne Strukturen.

Nach dem Lesen dieses Artikels , gibt es dann noch weitere Bedenken, die ich gegen die Verwendung dieser Artikel haben sollte?

Siehe auch:

  
    
matt_dev 12.03.2009, 21:42
quelle

7 Antworten

11

Sie sollten die folgenden Überlegungen zu Strukturen treffen:

  • Strukturen sollten unveränderlich sein (veränderbare Strukturen sind nicht intuitiv und unvorhersehbar)
  • structs immer haben einen (öffentlichen, parameterlosen) Standardkonstruktor, der nicht geändert werden kann
  • struct Größe sollte 16 Bytes
  • nicht überschreiten
  • Die Methoden Equals und GetHashCode sollten für eine bessere Leistung überschrieben werden
  • das Implementieren der IEquatable<T> Schnittstelle wird empfohlen
  • redefining und == und die != -Operatoren werden ebenfalls empfohlen
Michael Damatov 12.03.2009, 22:04
quelle
11

Ich definiere fast nie benutzerdefinierte Strukturen. Es gibt einfach nicht so viele natürliche Werttypen, IMO.

Insbesondere würde ich sehr, sehr sorgfältig überlegen, bevor ich eine veränderbare Struktur definiere, besonders wenn sie über eine Schnittstellenimplementierung mutiert. Veränderliche Strukturen verhalten sich auf eine Weise, die die Leute gar nicht erwarten, was zu einem Code führt, der schwer zu verstehen ist.

Ich denke, es lohnt sich, "Auswählen zwischen Klassen und Strukturen" von "Design-Richtlinien für die Entwicklung von Klassenbibliotheken" .

Insbesondere:

  

Definieren Sie keine Struktur, es sei denn, die   Typ hat alle folgenden Eigenschaften   Eigenschaften:

     
  • Es stellt logisch eine einzelne dar   Wert, ähnlich wie bei primitiven Typen   (Integer, Double und so weiter).

  •   
  • Es hat eine Instanzgröße kleiner als   16 Bytes.

  •   
  • Es ist unveränderlich.

  •   
  • Es muss nicht häufig eingerahmt werden.

  •   

Entwickeln Sie wirklich Typen mit all diesen Eigenschaften häufig?

    
Jon Skeet 12.03.2009 22:04
quelle
4

Sie passen nicht in ein Objektorientiertes Programmierparadigma wie Klassen. Sie sind gut für kleine Datenstrukturen, aber ich verwende Klassen für alles andere.

    
Ed S. 12.03.2009 21:46
quelle
0

Ich denke, Hauptzweck einer Struktur - nur variable Typen zu halten. Wenn Sie einige Klassen in struct behalten - Sie liegen falsch.

    
abatishchev 12.03.2009 21:46
quelle
0

Stellen Sie sich die folgenden Fragen zu dem Datensatz, den Sie mit einer Struktur modellieren:

  • Könnte es jemals brauchen Logik bekommen / setzen?
  • Kann es jemals JEDE Logik speichern? das ist endemisch für die Daten?
  • Müsste es einen anderen Satz erben von Daten?
  • Könnte eine andere Datenmenge haben erben diese?

Ich denke, wenn Sie all diese Fragen mit "Nein" beantworten können, gibt es keinen guten Grund, keine Struktur zu verwenden. Ich denke, dass Leute statische Unterklassen in bestimmten Situationen verwenden, in denen eine Struktur mehr als gut genug wäre.

    
danieltalsky 12.03.2009 21:58
quelle
0

Eine Klasse ist viel einfacher zu implementieren als eine Struktur. Wenn Sie eine Struktur falsch implementieren, kann es einige unerwartete Fehler geben.

Eine Struktur sollte nicht größer als 16 Byte sein, oder Sie verlieren die meisten Leistungsvorteile.

Eine Struktur soll ein Werttyp sein, der eine einzelne Entität irgendeiner Art darstellt.

Eine Struktur sollte unveränderlich sein. Das bedeutet, dass Sie niemals eine der Eigenschaften in einer Struktur ändern. Wenn Sie einen anderen Strukturwert haben möchten, erstellen Sie einen neuen Wert.

    
Guffa 12.03.2009 22:08
quelle
0

Die Verwendung von Strukturen sollte begrenzt sein, wenn Sie nur eine kleine Datenstruktur benötigen. (Wie du liest). Ich würde sie nur für die kleinsten Datenstrukturen wie Koordinaten, Offsets und manchmal für Grafiken verwenden.

In vielerlei Hinsicht können Sie sich Strukturen in C # als verkleinerte Klassen vorstellen. Sie sind im Grunde die gleichen wie Klassen, aber eher für Fälle, in denen Sie einfach einige Daten zusammen gruppieren möchten. Sie unterscheiden sich von Klassen wie folgt: Einige Dinge, die Sie beachten sollten

  • Structs sind Werttypen, nicht    Referenztypen. Dies bedeutet, dass sie es sind    entweder im Stapel gespeichert oder    Linie (wenn sie Teil eines anderen sind    Objekt, das auf dem Heap gespeichert ist)    und haben die gleiche Lebensdauer    Einschränkungen als die einfachen Daten    Typen.
  • Structs unterstützen keine Vererbung.
  • Es gibt einige Unterschiede in der Wegkonstruktoren arbeiten für Strukturen. Insbesondere der Compiler immer liefert einen Standard - No - Parameter Konstruktor, was du nicht bist erlaubt zu ersetzen.
Paperino 12.03.2009 22:15
quelle

Tags und Links