Details darüber, was passiert, wenn eine Struktur eine Schnittstelle implementiert

Ich kam vor kurzem in diesem Stackoverflow-Frage: Wann Struktur?

In ihm, er hatte eine Antwort, die sagte etwas, was ein bisschen Tiefe:

Darüber hinaus erkennen, dass, wenn eine Struktur eine Schnittstelle implementiert - als
Enumerator ist - und ist gewirkt, die umgesetzt type, struct
wird ein Referenz-Typ und bewegt wird, um den heap. Interne
Dictionary-Klasse, Enumerator noch einen Wert geben. Doch so schnell
als Methode fordert GetEnumerator(), die einen Verweis-Typ IEnumerator ist
zurückgegeben.

Genau das, was bedeutet das?

Wenn ich etwas wie

struct Foo : IFoo 
{
  public int Foobar;
}

class Bar
{
  public IFoo Biz{get; set;} //assume this is Foo
}

...

var b=new Bar();
var f=b.Biz;
f.Foobar=123; //What would happen here
b.Biz.Foobar=567; //would this overwrite the above, or would it have no effect?
b.Biz=new Foo(); //and here!?

Was genau sind die detaillierte Semantik einen Wert-Typ-Struktur behandelt werden wie ein Referenz-Typ?

  • Ich denke, Sie beantwortet diese selbst - "die struct wird ein Referenz-Typ und bewegt wird, um den heap"
  • Ich weiß nicht, was Foobar ist in deinem Beispiel...
  • also zwei Referenzen auf das gleiche? Was ist, wenn der Wert geben Sie die änderungen? Gibt es eine MSDN-Dokumentation oder etwas zu erklären, das?
  • Es wird als boxing bezeichnet und viel Dokumentation auf der MSDN-Website. msdn.microsoft.com/en-us/library/yz2be5wk.aspx Haben Sie getestet, der code, den Sie geschrieben?
  • Dies scheint nicht "nur" Boxen. Ich meine, später wird es nicht angezeigt, ein unboxing und die "struct wird ein Referenz-Typ und bewegt wird, um den heap" scheint darauf hinzudeuten, dass der ohne Verpackung Art wird eine veränderbare Box geben
  • denken Sie an dieses: wenn ich versuche Foo foo = b.Biz; ich bekomme ein 'kann Nicht implizit konvertiert "ifoo") vom Typ Foo` Kompilierungs-Fehler - müssen Sie explizit box/unbox, was, warum und wie foo = null da Wert-Typen können nicht null (Zeiger auf Wert-Typ auf heap = null)
  • zwei Verweise immer auf das gleiche Objekt zeigen, das ist sicher. Nur nicht in die Beispiele, die Sie zur Verfügung gestellt. in deinem Beispiel f.Foobar = 123 Ergebnis wäre ein null-Verweis-Ausnahme-seit b nicht haben, es ist Biz Feld initialisiert.
  • Haben Sie den code testen? Es wirft einen Fehler.
  • es war einfach getrimmt code. Ich habe es tatsächlich geschafft kompiliert und getestet in meiner Antwort weiter unten. Es gibt einen riesigen Unterschied zwischen dem boxing/unboxing und nur "mit Hilfe" der Schnittstelle
  • Nein, das ist nicht beschnitten code aus deiner Antwort, oder Sie würden nicht mal die Frage gepostet. Dass getrimmt code lässt sich der Grund für das scheitern explizit unbox.
  • Struct-Mitglieder erhalten this eine "byref" [hinter-den-kulissen Begriff für die Sache, die übergeben durch einen ref parameter]. Wenn ein struct-member aufgerufen wird, auf eine Box-Objekt, es verhält sich, als ob der boxed-Objekt hatte ein Feld der Struktur-Typ, und übergeben, das Feld, durch ref wie die Struktur der this parameter. Beachten Sie, dass es keine Möglichkeit gibt, nach einer Methode, die auf eine Box-Struktur, um eine Referenz auf das Objekt enthalten. Wenn so eine Methode weitergeben will eine eigene Instanz an eine Methode, die eine Schnittstelle oder ein Verweis geben, es muss re-box.

InformationsquelleAutor Earlz | 2013-03-04
Schreibe einen Kommentar