2009-07-13 12 views
1

Der Titel möglicherweise falsch, wenn ja, bitte ändern. Ich bin nicht sicher, wie ich meine Frage stellen soll, also schau dir einfach den Code an, wie es offensichtlich sein sollte.Wie wird eine Struktur als Eigenschaft definiert?

Verwenden Sie den kommentierten Code funktioniert, aber ich möchte wissen, warum der eigentliche Code nicht funktioniert. Ich bin mir sicher, dass es falsch ist, aber wie kann es behoben werden? Oder ist es nicht wie es gemacht wird?

Antwort

9

Eine Struktur wird nur nach Wert kopiert, so dass Sie nur die Kopie ändern, die zurückgegeben wurde. Verwenden Sie eine Klasse.

5

Verwenden

Foo.FooBar myFooBar = new Foo.FooBar { Baz = 1 }; 
f.Bar = myFooBar; 

Wie Steven sagte, müssen Sie eine Instanz einer Struktur zu erstellen, und die Eigenschaft, um es einzustellen. Sonst wird es nach Wert übergeben.

+1

Das ist richtig. Diese Art von unerwartetem Verhalten ist Teil des Arguments, dass struct unveränderlich ist. –

+0

@Steven Sudit: Sortieren von. Was passieren sollte, wäre, dass nur struct-Methoden/Eigenschaften, die speziell als Mutatoren deklariert wurden, "this" modifizieren dürfen und die Verwendung solcher Methoden/Eigenschaften in schreibgeschützten Kontexten verboten wäre. Ferner sollte das System ein Mittel zum Implementieren echter Referenztypeigenschaften bereitstellen. Sie könnten sicherer und effizienter als Schließungen implementiert werden, aber leider ist die Syntax ohne Sprachunterstützung ziemlich entsetzlich. Ich würde gerne über das Thema reden, wenn jemand interessiert ist. – supercat

+0

@super: Anstatt "this" zu mutieren, ist es besser, eine Kopie zu erstellen, die sich im angegebenen Wert unterscheidet. –

1

Auch Sie können sich die Struktur als "bereits zugewiesen" vorstellen, so dass Sie nicht zu neu() brauchen. Statt

this.Bar = new FooBar(); 

Just do

this.Bar.Baz = 1; 
Verwandte Themen