2009-02-10 19 views

Antwort

7

Ein häufiges Beispiel ist, wo die Struktur ein Mitglied eines Objekts ist, das im Heap zugeordnet ist. Es gibt viele zusätzliche Details in dieser Frage hier. What’s the difference between struct and class in .Net?

+0

aber ist eine Struktur fast immer ein Mitglied eines Objekts, das auf dem Heap zugeordnet ist? Ist das nicht überall der Fall, außer wenn die Struktur nur eine lokale Variable ist? –

+0

Fast überall. Eine Struktur kann auch ein statisches Mitglied einer Klasse sein. In diesem Fall ist sie kein Mitglied eines Objekts und wird dennoch auf dem Heap zugewiesen. – yfeldblum

+0

@Simon_Weaver Eine Werttypvariable, die an eine Methode übergeben wird. Es muss nicht in einer Methode definiert werden. Du verwirrst die Mechanik mit der Frequenz, die du verwendest. Mechanik ist wichtig, nicht wie oft sie gebraucht wird. –

2

Wenn die Instanz value typeboxed erhält, wird die Box und damit die Instanz selbst in den Heap verschoben. Es besteht jedoch kein Zweifel daran, dass eine Nicht-Klassen-Membertyp-Instanz bei der ersten Erstellung immer auf dem Stapel erstellt wird.

Eine Struktur ist ein Werttyp. Es verhält sich also wie oben.

+0

Der Boxed-Typ selbst ist eigentlich ein Referenztyp, wohlgemerkt. Jeder Werttyp hat eine Art schattierte Referenztypversion für das Boxen. Es ist ein bisschen kompliziert. Der Fall "Mitglied einer Klasse" ist viel weniger fraglich IMO :) –

+0

Technisch wird der Werttyp in das Mitglied der Box kopiert, die bereits auf dem Heap vorhanden ist. So "bewegt" es sich nicht auf den Haufen. Der Begriff Boxed-Typ ist eine falsche Bezeichnung. Ich finde es einfacher, wenn Sie einen Werttyp als Referenztyp haben wollen, um ihn bereits als Referenztyp zu haben. Werttypen sollten für unveränderliche Datenübertragungen über eine Pipe an einen Drittanbieter reserviert werden. –

4

Jedes Mal, wenn sie ein Feld für eine Klasse

Ungewöhnliche Beispiele:

a: Wenn ein Wert Variable vom Typ erfasst wird:

int i = 2; 
Action action = delegate {i++;} 
action(); 
Console.WriteLine(i); 

Diese etwas kompiliert mehr wie:

class Foo { 
    public int i; 
    public void Bar() {i++;} 
} 
... 
Foo foo = new Foo(); 
foo.i = 2; 
Action action = foo.Bar; 
action(); 
Console.WriteLine(foo.i); 

b: Wenn ein Wert vom Typ Variable wird in einem Iterator Block verwendet:

IEnumerable<int> GetValues() { 
    for(int i = 0 ; i < 5 ; i++) yield return i; 
} 

(erzeugt der Compiler eine Zustandsmaschine den Iterator zu repräsentieren, von denen alle lokalen Variablen (wie i) sind Felder)

2

Nur als Beispiel für the answer from 1800 INFORMATION:

public class Foo 
{ 
    int x; 

    public Foo(int y) 
    { 
     x = y; 
    } 
} 

... 

Foo foo = new Foo(10); 

Jetzt, nachdem die Konstruktor Ausführung beendet hat, 10 der Wert von foo.x Wo liegt foo.x in Erinnerung? Auf dem Haufen. Was ist der Typ von foo.x? int aka System.Int32, die eine Struktur ist.

Die anderen Antworten über erfasste Variablen und Boxen usw. sind auch korrekt ("Art" im Boxfall - ich werde einen Kommentar hinzufügen), aber dieses Beispiel ist das einfachste und wichtigste, IMO.

+0

Sind alle Werttypen Strukturen? – mmcdole

+0

Es gibt Strukturen und Enums - das ist das Los, glaube ich. –

+0

. Net ist seltsam. Ein int ist eine Struktur. Als C++ - Entwickler wird das einiges an Gewöhnung an –

0

bereits eingehend erwähnt von anderen

  • Mitgliedfeldwerte
  • boxed structs (streng sie sind dann nicht mehr Werttypen)

Zusätzlich:

  • Ein Array von Strukturen befindet sich vollständig auf dem Heap
  • Statische Strukturen (nicht auf dem Stapel oder dem Heap, sondern in einem eigenen Bereich)
+0

boxed structs/array of/static == Mitgliedsfeld –

0

Das Buch machte den Fehler, Schreibmechanik mit Oszilloskopmechanik zu verwechseln. Ein Werttyp ist kein Referenztyp. Es werden Daten kopiert, wenn Sie eine Methode aufrufen, die sie als Argument verwendet (ohne ref oder out). Werttypen werden auf dem Stapel im Rahmen einer Methode statt auf dem Heap als Referenzobjekt gespeichert, was jedoch nicht bedeutet, dass sie immer auf dem Stapel vorhanden ist.

Also macht das Buch eine Verwendung Aussage statt einer Mechanik Aussage, und verwirrend die beiden. Es ist keine totale Behauptung, aber es ist falsch.

Wertetypen werden überall dort aufbewahrt, wo sich ihr Besitzer befindet.

Also, wenn ihr Bereich eine Methode ist, werden sie auf dem Stapel sein. Wenn ihr Bereich ein Objekt ist, werden sie mit dem Objekt auf dem Heap leben.

Damit ist es ziemlich sicher zu sagen, ein Wert-Typ ist am besten als unveränderlich, da die meisten Menschen eine harte Zeit haben, die Wert-Typ-Mechanismen von Wert zu prognostizieren.