2009-02-10 5 views

Répondre

7

Un exemple courant est où la structure est un membre d'un objet qui est alloué dans le tas. Il y a beaucoup de détails supplémentaires dans cette question ici. What’s the difference between struct and class in .Net?

+0

mais n'est pas une structure presque TOUJOURS un membre d'un objet qui est alloué sur le tas? n'est-ce pas le cas partout sauf quand la structure est juste une variable locale? –

+0

Presque partout. Une structure peut également être un membre statique d'une classe, auquel cas elle n'est pas membre d'un objet et est néanmoins allouée sur le tas. – yfeldblum

+0

@Simon_Weaver Une variable de type valeur transmise à une méthode. Il n'a pas besoin d'être défini dans une méthode. Vous confondez la mécanique avec la fréquence d'utilisation. La mécanique est ce qui compte, pas la fréquence d'utilisation. –

2

Lorsque l'instance d'un value type obtient boxed, la boîte, et par conséquent l'instance elle-même, est déplacé sur le tas. Bien que, il ne fait aucun doute qu'une instance de type valeur de membre non-classe lors de la première création est toujours créée sur la pile.

Une structure est un type de valeur. Donc, il se comporte comme ci-dessus.

+0

Le type encadré lui-même est en fait un type de référence, pensez-y. Tout type de valeur a une sorte de version de type de référence ombrée pour la boxe. C'est un peu compliqué. Le cas "membre d'une classe" est beaucoup moins discutable IMO :) –

+0

Techniquement, le type de valeur est copié dans le membre de la boîte, qui existe déjà sur le tas. Donc ça ne "bouge" pas dans le tas. Le terme boxed-type est un terme inapproprié. Je trouve plus facile si vous voulez avoir un type de valeur comme type de référence, pour qu'il soit déjà un type de référence. Les types de valeur doivent être réservés pour le transfert immuable ou le transfert de données via un canal vers un tiers. –

4

Chaque fois qu'ils sont un champ sur une classe

exemples inhabituels de cette:

a: Lorsqu'une variable valeur de type est capturée:

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

C'est compilé à quelque chose plus comme:

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: Lorsqu'une variable valeur de type est utilisée dans un bloc itérateur:

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

(le compilateur génère une machine d'état pour représenter l'itérateur, dont toutes les variables locales (telles que i) sont des champs)

2

Tout comme un exemple de the answer from 1800 INFORMATION:

public class Foo 
{ 
    int x; 

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

... 

Foo foo = new Foo(10); 

maintenant, après que le constructeur a terminé son exécution, la valeur de foo.x est 10. Où se trouve foo.x en mémoire? Sur le tas. Quel est le type de foo.x? int aka System.Int32, qui est une struct. Les autres réponses sur les variables capturées et la boxe etc sont correctes aussi ("sorte de" dans le cas de boxe - je vais ajouter un commentaire), mais cet exemple est le plus simple et le plus important, IMO.

+0

Tous les types de valeurs sont-ils structurés? – mmcdole

+0

Il y a des structs et des enums - c'est le lot, je crois. –

+0

.Net est bizarre. Un int est une struct. En tant que développeur C++, cela prendra un peu de temps pour s'habituer à –

0

déjà mentionné en profondeur par d'autres

  • champ membres valeurs
  • struct boxed (strictement ils sont alors aucun type de valeur plus)

En plus:

  • Une tableau de structures réside entièrement sur le tas
  • structures statiques (pas sur la pile ou le tas, mais dans une zone spéciale de leurs propres)
+0

structures encadrées/tableau de/static == champ membre –

0

Le livre a fait l'erreur de confondre la mécanique de frappe avec la mécanique de la portée. Un type de valeur n'est pas un type de référence. Ses données sont copiées lorsque vous appelez une méthode en l'utilisant comme argument (sans ref ou out). Les types de valeur vont vivre sur la pile dans le cadre d'une méthode, plutôt que sur le tas comme le fait un objet de référence, mais cela ne veut pas dire qu'elle restera toujours sur la pile. Ainsi, le livre fait une déclaration d'utilisation au lieu d'une déclaration mécanique, et confond les deux. Ce n'est pas une affirmation sans fondement totale, mais c'est faux.

Les types de valeur seront détenus partout où se trouve leur propriétaire. Donc, si leur portée est une méthode, ils seront sur la pile. Si leur portée est un objet, ils vont vivre avec l'objet sur le tas. Avec cela, il est assez sûr de dire, un type de valeur est préférable de rester immuable, car la plupart des gens ont du mal à prédire la mécanique de la valeur de type valeur.

Questions connexes