837 votes

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

Je suis à la recherche d'une façon claire, concise et précise réponse.

Idéalement, la réponse réelle, bien que les liens vers de bonnes explications de bienvenue.

1200voto

Lasse V. Karlsen Points 148037

Dans .NET, il y a deux catégories de types, les types de référence et des types de valeur.

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

Le général différence est qu'un type de référence de la vie sur le tas, et un type de valeur de la vie en ligne, qui est, partout où il est de votre variable ou un champ est défini.

Une variable contenant une valeur de type contient l'intégralité de la valeur type de la valeur. Pour une structure, ce qui signifie que la variable contient l'ensemble de la structure, avec tous ses champs.

Une variable contenant un type de référence contient un pointeur ou une référence à un autre endroit de la mémoire où la valeur réelle réside.

Cela a un avantage, à commencer par:

  • *type de valeur*s contient toujours une valeur
  • les types de référence peut contenir une valeur nullde référence, ce qui signifie qu'ils ne renvoient pas à quoi que ce soit pour le moment

En interne, *le type de référence*s sont mis en œuvre comme des pointeurs, et sachant que, et de savoir comment l'attribution de la variable fonctionne, il y a d'autres modes de comportement:

  • copie le contenu d'un type de la valeur de la variable dans une autre variable, des copies tout le contenu dans la nouvelle variable, ce qui rend les deux distincts. En d'autres termes, après la copie, des modifications à l'un n'affecte pas l'autre
  • copie le contenu d'une référence de type de variable dans une autre variable, des copies de la référence, ce qui signifie que vous avez maintenant deux références pour le même ailleurs stockage des données réelles. En d'autres termes, après la copie, la modification de données dans une seule référence apparaîtra à influer sur les autres, mais seulement parce que vous êtes vraiment juste en regardant les mêmes données à la fois des lieux

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

  • variable: type de valeur de la vie sur la pile, type de référence de la vie sur la pile comme un pointeur vers quelque part dans la mémoire du tas où la mémoire réelle vie
  • class/struct-champ: type de valeur de la vie à l'intérieur de la classe, le type de référence vit à l'intérieur de la classe comme un pointeur vers quelque part dans la mémoire du tas où la mémoire réelle vie.

250voto

Thomas Bratt Points 10738

Un bref résumé de chaque:

Catégories:

  • Peut supporter l'héritage
  • Sont référence (pointeur) types
  • La référence peut être null
  • Ont surcharge de la mémoire par exemple

Les Structures Uniquement:

  • Ne peut pas supporter l'héritage
  • Sont les types de valeur
  • Sont passés par valeur (tels que les entiers)
  • Ne peut pas avoir une référence null (à moins de prendre la valeur null est utilisé)
  • N'ont pas de surcharge de la mémoire par exemple - sauf 'en boîte'

Les deux Classes et les Structures:

  • Sont composées de données des types généralement utilisés pour contenir un peu de variables qui ont une relation logique
  • Peut contenir des méthodes et des événements
  • Pouvez en charge des interfaces

54voto

Keith Points 46288

Dans .Net la structure et les déclarations de classe différencier les types de référence et des types de valeur.

Lorsque vous passez autour d'un type de référence, il n'existe qu'un seul en fait stockées. Tout le code qui accède à l'instance est en train d'accéder au même.

Lorsque vous passez autour d'un type de valeur de chacun est une copie. Tout le code est de travailler sur son propre exemplaire.

Cette situation peut être illustrée par 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 qu'ils peuvent être vides, mais jamais nulle. Pour cette raison, les structures de toujours avoir un constructeur par défaut sans paramètre - ils besoin d'une "valeur de départ'.

18voto

Zooba Points 6440

Les Instances des classes sont stockées sur le tas managé. Toutes les variables qui contiennent une instance sont tout simplement une référence à l'instance sur le tas. Passage d'un objet à une méthode entraîne une copie de la référence, non pas à l'objet lui-même.

Structures (techniquement, les types de valeur) sont stockées 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 sur mesure constructeur par copie. Le passage d'un type de valeur à une méthode consiste à copier la totalité de la valeur, de nouveau sans avoir à se prévaloir de tout personnalisable code.

La distinction se fait mieux par le C++/CLI noms: "classe de référence" est une classe comme décrit en premier lieu, "la valeur de la classe" est une classe comme décrit à la seconde. Les mots "classe" et de "struct", tel qu'utilisé par le C# sont tout simplement quelque chose qui doit être appris.

9voto

JohnIdol Points 16355

La question est assez bien répondu à ce point.

Il peut être intéressant d'un rapide guide pour choisir entre les struct et class dans tous les jours de codage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X