Frage

  

Mögliche Duplizieren:
   Warum sind wandelbar structs böse?

Ich las es in vielen Orten wie hier, dass es besser ist, structs als unveränderlich zu machen.

Was ist der Grund dahinter? Ich sehe viele Microsoft erstellte structs, die wandelbar sind, wie die, die in xna. Wahrscheinlich gibt es viele weitere in der BCL.

Was sind die Vor- und Nachteile der nicht dieser Leitlinie folgen?

War es hilfreich?

Lösung

Structs sollte repräsentieren Werte . Werte ändern sich nicht. Die Zahl 12 ist ewig.

Allerdings betrachten:

Foo foo = new Foo(); // a mutable struct
foo.Bar = 27;
Foo foo2 = foo;
foo2.Bar = 55;

Jetzt foo.Bar und foo2.Bar ist anders, die oft unerwartet. Vor allem in den Szenarien wie Eigenschaften (zum Glück der Compiler erkennen this). Aber auch Sammlungen etc; wie Sie sie jemals vernünftig mutieren?

Datenverlust viel zu einfach, mit wandelbarem structs ist.

Andere Tipps

Der große Nachteil ist, dass die Dinge verhalten sich nicht wie Sie es erwarten -. Insbesondere, wenn die Veränderlichkeit aus einem Gemisch aus dem direkten Wert kommt und ein Referenz-Typ innerhalb it

Um ehrlich zu sein, kann ich nicht die Spitze von meinem Kopf erinnern off all die seltsamen Probleme Ich habe Menschen mit in Newsgroups kommen zu sehen, wenn sie wandelbar structs verwendet haben - aber diese Gründe existieren sicher. Mutable structs Probleme verursachen. Bleiben Sie weg.

EDIT: Ich habe gerade eine E-Mail habe ich zu diesem Thema vor einiger Zeit geschrieben hätte. Es erarbeitet nur ein wenig:

  • Es ist philosophisch falsch: eine Struktur soll irgendeine Art von fundamentalem Wert darstellen. Das ist im Grunde unveränderlich. Sie erhalten nicht die Nummer ändern 5. Sie können den Wert einer Variable ändern 5 bis 6, aber Sie müssen nicht logisch eine Änderung auf den Wert selbst machen.

  • Es ist praktisch ein Problem: es schafft viele seltsame Situationen. Es ist besonders schlimm, wenn es über eine Schnittstelle wandelbar ist. Dann können Sie boxed Werte zu ändern beginnen. Ick. Ich habe eine Menge von Newsgroup-Beiträge gesehen, die Menschen wegen, die versuchen, wandelbar structs zu bedienen und laufen in Probleme. Ich sah ein sehr seltsames LINQ Beispiel, das versagt wurde, weil List<T>.Enumerator eine Struktur ist, zum Beispiel.

Ich benutze wandelbar structs oft in meinem (Performance kritisch) Projekt - und ich laufe nicht in Probleme, weil ich die Auswirkungen der Kopie Semantik verstehen. Soweit ich das beurteilen kann, plädieren der Hauptgrund Menschen unveränderlich structs ist so, dass Menschen, die nicht verstehen die Auswirkungen nicht selbst in Schwierigkeiten geraten können.

Das ist nicht so eine schreckliche Sache - aber wir in Gefahr sind jetzt davon „das Evangelium der Wahrheit“, wenn in der Tat gibt immer Zeiten, wo es legitim die beste Option ist eine Struktur wandelbar zu machen. Wie bei allen Dingen gibt es Ausnahmen von der Regel.

Es gibt nichts billiger zu manipulieren als ein veränderliches Struktur, weshalb oft Sie es im Bereich der Hochleistungs-Code wie die Grafikverarbeitungsroutinen zu sehen.

Leider wandelbar structs spielt nicht gut mit Objekten und Eigenschaften, es ist viel zu einfach, eine Kopie eines stuct anstelle der Struktur selbst zu modifizieren. So sind sie von Ihrem Code nicht geeignet für die meisten.

P. S. Um die Kosten für das Kopieren von wandelbaren structs zu vermeiden, werden sie in der Regel gespeichert und weitergegeben in Arrays.

Es sollte eine Struktur im Allgemeinen eine einzige Einheit irgendeine Art darstellen. Als solches ist es nicht viel Sinn macht, eine der Eigenschaften des Wertes zu ändern, ist es sinnvoller ist, einen völlig neuen Wert zu erstellen, wenn Sie einen Wert wollen, die irgendwie anders ist.

Die Semantik einfacher wird, wenn unveränderliche Strukturen verwenden und vermeiden Gefahren wie folgt aus:

// a struct
struct Interval {
   int From { get; set; }
   int To { get; set; }
}

// create a list of structs
List<Interval> intervals = new List<Interval>();

// add a struct to the list
intervals.Add(new Interval());

// try to set the values of the struct
intervals[0].From = 10;
intervals[0].To = 20;

Das Ergebnis ist, dass die Struktur in der Liste nicht verändert wird. Der Ausdruck Intervall [0] kopiert den Wert der Struktur aus der Liste, Sie dann die Eigenschaft des temporären Wertes ändern, aber der Wert ist nie in der Liste setzen.

Edit:. Das Beispiel geändert anstelle eines Arrays eine Liste zu verwenden,

Beim Kopieren structs um Sie ihren Inhalt zu kopieren, wenn Sie also eine kopierte Version ändern die „Original“ wird nicht aktualisiert werden.

Dies ist eine Quelle für Fehler, da auch wenn Sie wissen, dass Sie in die Falle tappen, eine Struktur zu kopieren (nur, indem es eine Methode übergeben) und Modifizieren die Kopie.

passiert mir einfach wieder letzte Woche, hielt mich eine Stunde Suche für einen Fehler.

Keeping structs unveränderlich wird verhindert, dass ...

Anders als das Sie benötigen, um sicherzustellen, dass Sie einen wirklich guten Grund haben structs in erster Linie zu verwenden - „Optimierung“ oder „Ich möchte etwas, das schnell auf dem Stapel reserviert“ zählt nicht als Antwort. Marshalling oder Dinge, wo man auf das Layout abhängen - ok, aber man sollte um nicht in der Regel jene structs halten sehr lange, sind sie Werte nicht Objekte

.

der Grund, warum Sie sollten structs unveränderlich machen ist, dass sie ValueTypes , was bedeutet, dass sie jedes Mal, wenn sie an eine Methode übergeben werden kopiert.

Also, wenn, zum Beispiel, Sie hatten eine Eigenschaft, die eine Struktur zurückgegeben, auf dieser Struktur wertlos wäre, den Wert eines Feldes ändern, da der Getter zurückkehren würde eine Kopie der Struktur, eher als ein Verweis auf das struct. Ich habe dies in Code getan gesehen, und es ist oft schwer zu fangen.

Wenn Sie Ihren structs für Unveränderlichkeit entwerfen, zu helfen, der Programmierer dieser Fehler zu vermeiden.

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