Question Quelle est la différence entre struct et class dans .NET?


Quelle est la différence entre struct et class dans .NET?


496
2017-08-16 08:21


origine


Réponses:


Dans .NET, il existe deux catégories de types, types de référence et types de valeur.

Les structures sont types de valeur et les classes sont types de référence.

La différence générale est que Type de référence vit sur le tas, et un type de valeur vit en ligne, c'est-à-dire, où que soit votre variable ou champ est défini.

Une variable contenant un type de valeur contient l'ensemble type de valeur valeur. Pour une structure, cela signifie que la variable contient la structure entière, avec tous ses champs.

Une variable contenant un Type de référence contient un pointeur ou un référence ailleurs dans la mémoire où réside la valeur réelle.

Cela a un avantage, pour commencer:

  • types de valeur contient toujours une valeur
  • types de référence peut contenir un nul-référence, ce qui signifie qu'ils ne renvoient à rien du tout pour le moment

Intérieurement, Type de références sont implémentés comme des indicateurs, et sachant que, et sachant comment fonctionne l'attribution des variables, il existe d'autres modèles de comportement:

  • copier le contenu d'un type de valeur variable dans une autre variable, copie le contenu entier dans la nouvelle variable, rendant les deux distinctes. En d'autres termes, après la copie, les changements à l'un n'affecteront pas l'autre
  • copier le contenu d'un Type de référence variable dans une autre variable, copie la référence, ce qui signifie que vous avez maintenant deux références à la même ailleurs stockage des données réelles. En d'autres termes, après la copie, changer les données dans une référence semblera affecter l'autre aussi, mais seulement parce que vous regardez vraiment les mêmes données dans les deux endroits.

Lorsque vous déclarez des variables ou des champs, voici comment les deux types diffèrent:

  • variable: type de valeur vit sur la pile, Type de référence vit sur la pile comme un pointeur vers quelque part dans la mémoire de tas où la mémoire réelle vit (bien que note Eric Lipperts série d'articles: La pile est un détail de mise en œuvre.)
  • classe / struct-field: type de valeur vit complètement à l'intérieur du type, Type de référence vit à l'intérieur du type comme un pointeur vers quelque part dans la mémoire de tas où la mémoire réelle vit.

833
2017-08-16 18:41



Un bref résumé de chacun:

Classes seulement:

  • Peut supporter l'héritage
  • Sont des types de référence (pointeur)
  • La référence peut être nulle
  • Avoir un surcoût de mémoire par nouvelle instance

Structs Only:

  • Impossible de prendre en charge l'héritage
  • Sont les types de valeur
  • Sont passés par valeur (comme les entiers)
  • Impossible d'avoir une référence null (sauf si Nullable est utilisé)
  • Ne pas avoir de surcharge mémoire par nouvelle instance - à moins d'être «encadré»

Les deux classes et structures:

  • Les types de données composés sont-ils généralement utilisés pour contenir quelques variables ayant une relation logique
  • Peut contenir des méthodes et des événements
  • Peut supporter les interfaces

136
2017-10-04 22:07



Dans .NET, les déclarations struct et class font la différence entre les types de référence et les types de valeur.

Lorsque vous passez un type de référence, un seul est réellement stocké. Tout le code qui accède à l'instance accède au même.

Lorsque vous passez un type de valeur, chacun est une copie. Tout le code travaille sur sa propre copie.

Cela peut être montré avec un exemple:

struct MyStruct 
{
    string MyProperty { get; set; }
}

void ChangeMyStruct(MyStruct input) 
{ 
   input.MyProperty = "new value";
}

...

// Create value type
MyStruct testStruct = new MyStruct { MyProperty = "initial value" }; 

ChangeMyStruct(testStruct);

// Value of testStruct.MyProperty is still "initial value"
// - the method changed a new copy of the structure.

Pour une classe ce serait différent

class MyClass 
{
    string MyProperty { get; set; }
}

void ChangeMyClass(MyClass input) 
{ 
   input.MyProperty = "new value";
}

...

// Create reference type
MyClass testClass = new MyClass { MyProperty = "initial value" };

ChangeMyClass(testClass);

// Value of testClass.MyProperty is now "new value" 
// - the method changed the instance passed.

Les classes peuvent être rien - la référence peut pointer vers une valeur nulle.

Les structures sont la valeur réelle - elles peuvent être vides mais jamais nulles. Pour cette raison, les constructs ont toujours un constructeur par défaut sans paramètre - ils ont besoin d'une "valeur de départ".


28
2017-08-16 08:30



En plus de toutes les différences décrites dans les autres réponses:

  1. Structs ne peut pas avoir un constructeur explicite sans paramètre alors qu'une classe peut
  2. Structs ne peut pas avoir de destructeurs, alors qu'une classe peut
  3. Structs ne peut pas hériter d'une autre structure ou classe alors qu'une classe peut hériter d'une autre classe. (Les deux structures et les classes peuvent implémenter à partir d'une interface.)

Si vous êtes après une vidéo expliquant toutes les différences, vous pouvez vérifier Partie 29 - Tutoriel C # - Différence entre les classes et les structures en C #.


16
2018-06-14 16:57



Les instances de classes sont stockées sur le segment de mémoire géré. Toutes les variables "contenant" une instance sont simplement une référence à l'instance sur le tas. Si vous passez un objet à une méthode, une copie de la référence est transmise, pas l'objet lui-même.

Structures (techniquement, les types de valeur) sont stockés partout où ils sont utilisés, un peu comme un type primitif. Le contenu peut être copié par le moteur d'exécution à tout moment et sans invoquer un constructeur de copie personnalisé. Passer un type de valeur à une méthode implique de copier toute la valeur sans invoquer de code personnalisable.

La distinction est améliorée par les noms C ++ / CLI: "ref class" est une classe comme décrit en premier, "value class" est une classe comme décrit en second. Les mots-clés "class" et "struct" utilisés par C # sont simplement quelque chose qui doit être appris.


14
2017-08-16 12:16



De Microsoft Choisir entre classe et structure ...

En règle générale, la majorité des types dans un cadre devrait être   Des classes. Il existe toutefois certaines situations dans lesquelles   les caractéristiques d'un type de valeur le rendent plus approprié à utiliser   structs.

  CONSIDÉRER une structure au lieu d'une classe:

  • Si les instances du type sont petites et généralement de courte durée ou sont généralement incorporées dans d'autres objets.

X  ÉVITER une structure sauf si le type a tout du suivant   caractéristiques:

  • Il représente logiquement une valeur unique, similaire aux types primitifs (int, double, etc.).
  • Il a une taille d'instance inférieure à 16 octets.
  • C'est immuable. (ne peut pas être changé)
  • Il n'aura pas à être encadré fréquemment.

9
2018-05-14 19:58



Différence entre Struts et Classes -

  • Les structures sont du type valeur tandis que Les classes sont le type de référence.
  • Les structures sont stockées sur la pile tandis que Les classes sont stockées sur le tas.
  • Les types de valeur conservent leur valeur dans la mémoire où ils sont déclarés, mais type de référence contient une référence à une mémoire d'objet.
  • Les types de valeur sont détruits immédiatement après la portée est perdue alors que type de référence uniquement la variable détruite après la perte de la portée. le objet est ensuite détruit par le garbage collector.
  • Lorsque vous copiez struct dans une autre structure, une nouvelle copie de cette structure est créé modifié d'une structure n'affectera pas la valeur de la autre struct.
  • Lorsque vous copiez une classe dans une autre classe, elle copie uniquement variable de référence.
  • La variable de référence pointe vers le même objet sur le tas. La modification d'une variable affectera l'autre variable de référence.
  • Les structures ne peuvent pas avoir de destructeurs, mais les classes peuvent avoir des destructeurs.
  • Les structures ne peuvent pas avoir de constructeur explicite sans paramètre alors qu'un classe can structs ne supporte pas l'héritage, mais les classes le font. Tous les deux prendre en charge l'héritage d'une interface.
  • Les structures sont de type scellé.

6
2018-01-05 01:58