555 Stimmen

Warum sind veränderbare Strukturen "böse"?

Wenn ich die Diskussionen hier auf SO verfolge, habe ich schon mehrmals die Bemerkung gelesen, dass mutable structs "böse" sind (wie in der Antwort auf diese Frage ).

Was ist das eigentliche Problem mit Mutability und Structs in C#?

25 Stimmen

Die Behauptung, veränderbare Strukturen seien böse, ist wie die Behauptung, veränderbare int s, bool s, und alle anderen Werttypen sind böse. Es gibt Fälle für Veränderbarkeit und für Unveränderbarkeit. Diese Fälle hängen von der Rolle ab, die die Daten spielen, nicht von der Art der Speicherzuweisung/-freigabe.

63 Stimmen

@slipp int y bool sind pas wandelbar..

2 Stimmen

. -Syntax, wodurch Operationen mit ref-typed data und value-typed data gleich aussehen, obwohl sie sich deutlich unterscheiden. Dies ist ein Fehler von C#s Eigenschaften, nicht von Structs - einige Sprachen bieten eine alternative a[V][X] = 3.14 Syntax für In-Place-Mutationen. In C# ist es besser, Struktur-Member-Mutator-Methoden wie 'MutateV(Action<ref Vector2> mutator)` anzubieten und sie wie folgt zu verwenden a.MutateV((v) => { v.X = 3; }) (Das Beispiel ist aufgrund der Einschränkungen, die C# hinsichtlich der ref Schlüsselwort, sollte aber mit einigen Umgehungen möglich sein) .

1voto

ShaunnyBwoy Punkte 93

Ich glaube nicht, dass sie böse sind, wenn sie richtig eingesetzt werden. Ich würde sie nicht in meinen Produktionscode einbauen, aber ich würde sie für etwas wie strukturierte Unit-Testing-Mocks verwenden, bei denen die Lebensdauer einer Struktur relativ gering ist.

Wenn Sie das Beispiel von Eric verwenden, möchten Sie vielleicht eine zweite Instanz von Eric erstellen, aber Anpassungen vornehmen, da dies die Art Ihres Tests ist (d. h. Duplizierung, dann Änderung). Es spielt keine Rolle, was mit der ersten Instanz von Eric passiert, wenn wir Eric2 nur für den Rest des Testskripts verwenden, es sei denn, Sie planen, ihn als Testvergleich zu verwenden.

Dies wäre vor allem nützlich für das Testen oder Ändern von Legacy-Code, dass flache definiert ein bestimmtes Objekt (der Punkt der structs), aber durch eine unveränderliche Struktur, dies verhindert, dass es die Verwendung ärgerlich.

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