class / struct

Références

L'actualité

Librairie

L'information

Objects

Une définition de classe ou de struct s'apparente à un plan qui spécifie ce que le type peut faire. Un objet est fondamentalement un bloc de mémoire qui a été alloué et configuré selon le plan. Un programme peut créer de nombreux objets de la même classe. Les objets sont également appelés instances. Ils peuvent être stockés dans une variable nommée, dans un tableau ou dans une collection. Le code client est le code qui utilise ces variables pour appeler les méthodes et accéder aux propriétés publiques de l'objet. Dans un langage orienté objet tel que C#, un programme classique se compose de plusieurs objets qui interagissent de façon dynamique.

Comparaison des instances de struct et des instances de classe

Étant donné que les classes sont des types référence, une variable d'un objet de classe conserve une référence à l'adresse de l'objet sur le tas managé. Si un deuxième objet du même type est assigné au premier objet, les deux variables font référence à l'objet à cette adresse. Ce point est abordé en détail plus loin dans cette rubrique.

Les instances de classes sont créées à l'aide de l'opérateur new. Dans l'exemple suivant, Person est le type, et person1 et person2 sont des instances, ou objets, de ce type.

Étant donné que les structs sont des types valeur, une variable d'un objet de struct conserve une copie de l'objet entier. Les instances de structs peuvent également être créées à l'aide de l'opérateur new, mais cela n'est pas obligatoire, comme illustré dans l'exemple suivant :

La mémoire pour p1 et p2 est allouée sur la pile de threads. Cette mémoire est récupérée avec le type ou la méthode où elle est déclarée. C'est l'une des raisons pour lesquelles les structs sont copiés au moment de l'assignation. En revanche, la mémoire allouée pour une instance de classe est récupérée automatiquement (garbage collector) par le common language runtime quand toutes les références à l'objet sont hors de la portée. Il n'est pas possible de détruire de façon déterministe un objet de classe comme vous pouvez le faire dans C++.

L'allocation et la libération de mémoire sur le tas managé sont des opérations très optimisées dans le common language runtime. Dans la plupart des cas, il n'y a pas de différence significative sur le plan des performances entre l'allocation d'une instance de classe sur le tas et l'allocation d'une instance de struct sur la pile.

Comparaison de l'égalité de l'identité et des valeurs des objets

Quand vous effectuez une comparaison d'égalité entre deux objets, vous devez d'abord décider si vous souhaitez savoir si les deux variables représentent le même objet en mémoire, ou si les valeurs d'un ou de plusieurs de leurs champs sont équivalentes. Si vous projetez de comparer les valeurs, vous devez établir si les objets sont des instances de types valeur (structs) ou de types référence (classes, délégués, tableaux).

  • Pour déterminer si deux instances de classe référencent le même emplacement en mémoire (ce qui signifie qu'elles ont la même identité), utilisez la méthode statique Equals. (System.Object est la classe de base implicite pour tous les types valeur et types référence, y compris les classes et structs définis par l'utilisateur.)
  • Pour déterminer si les champs d'instance dans deux instances de struct ont les mêmes valeurs, utilisez la méthode ValueType.Equals. Comme tous les structs héritent implicitement de System.ValueType, vous appelez directement la méthode sur votre objet, comme indiqué dans l'exemple suivant :


L'implémentation System.ValueType de Equals utilise la réflexion, car elle doit être en mesure de déterminer la nature des champs dans chaque struct. Quand vous créez vos propres structs, substituez la méthode Equals pour fournir un algorithme d'égalité efficace qui est propre à votre type.

  • Pour déterminer si les valeurs des champs dans deux instances de classe sont égales, vous pouvez utiliser la méthode Equals ou l'opérateur ==. Toutefois, utilisez-les uniquement si la classe les a substitués ou surchargés pour fournir une définition personnalisée de ce que signifie "égalité" pour les objets de ce type. La classe peut également implémenter l'interface IEquatable‹T› ou IEqualityComparer‹T›. Les deux interfaces fournissent des méthodes qui peuvent être utilisées pour tester l'égalité des valeurs.