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.
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.
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:
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:
Lorsque vous déclarez des variables ou des champs, voici comment les deux types différents:
Un bref résumé de chaque:
Catégories:
Les Structures Uniquement:
Les deux Classes et les Structures:
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'.
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.
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 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.