C# LanguageType de valeur vs type de référence


Syntaxe

  • Passage par référence: public void Double (ref int numberToDouble) {}

Remarques

introduction

Types de valeur

Les types de valeur sont les plus simples des deux. Les types de valeur sont souvent utilisés pour représenter les données elles-mêmes. Un entier, un booléen ou un point dans un espace 3D sont tous des exemples de bons types de valeur.

Les types de valeur (structs) sont déclarés à l'aide du mot-clé struct. Voir la section syntaxe pour un exemple de comment déclarer une nouvelle structure.

De manière générale, nous avons 2 mots-clés utilisés pour déclarer les types de valeur:

  • Structs
  • Énumérations

Types de référence

Les types de référence sont légèrement plus complexes. Les types de référence sont des objets traditionnels au sens de la programmation orientée objet. Ainsi, ils prennent en charge l'héritage (et les avantages de celui-ci) et prennent également en charge les finaliseurs.

En C #, nous avons généralement ces types de référence:

  • Des classes
  • Les délégués
  • Interfaces

Les nouveaux types de référence (classes) sont déclarés à l'aide du mot-clé class. Pour un exemple, voir la section sur la syntaxe pour savoir comment déclarer un nouveau type de référence.

Différences majeures

Les principales différences entre les types de référence et les types de valeur peuvent être vues ci-dessous.

Des types de valeur existent sur la pile, des types de référence existent sur le tas

C'est la différence souvent mentionnée entre les deux, mais en réalité, lorsque vous utilisez un type de valeur en C #, tel qu'un int, le programme utilisera cette variable pour faire directement référence à cette valeur. Si vous dites int mine = 0, alors la variable mine fait directement référence à 0, ce qui est efficace. Cependant, les types de référence contiennent en réalité (comme leur nom l'indique) une référence à l'objet sous-jacent, ce qui s'apparente aux pointeurs dans d'autres langages tels que C ++.

Vous pourriez ne pas remarquer les effets de ceci immédiatement, mais les effets sont là, sont puissants et subtils. Voir l'exemple sur la modification des types de référence ailleurs pour un exemple.

Cette différence est la principale raison des différences suivantes et mérite d’être connue.

Les types de valeur ne changent pas lorsque vous les modifiez dans une méthode, les types de référence le font

Lorsqu'un type de valeur est transmis dans une méthode en tant que paramètre, si la méthode modifie la valeur de quelque manière que ce soit, la valeur n'est pas modifiée. En revanche, le passage d'un type de référence à cette même méthode et sa modification modifieront l'objet sous-jacent. d'autres objets utilisant ce même objet auront l'objet nouvellement modifié plutôt que leur valeur d'origine.

Voir l'exemple des types de valeur vs types de référence dans les méthodes pour plus d'informations.

Et si je veux les changer?

Transmettez-les simplement dans votre méthode en utilisant le mot-clé "ref" et vous transmettez ensuite cet objet par référence. Ce qui signifie que c'est le même objet en mémoire. Les modifications que vous apporterez seront donc respectées. Voir l'exemple sur le passage par référence pour un exemple.

Les types de valeur ne peuvent pas être null, les types de référence peuvent

Tout comme il est dit, vous pouvez attribuer la valeur NULL à un type de référence, ce qui signifie que la variable que vous avez affectée ne peut pas être associée à un objet réel. Dans le cas des types de valeur, cela n'est toutefois pas possible. Vous pouvez, cependant, utiliser Nullable, pour que votre type de valeur soit nullable, si cela est une exigence, mais si c'est quelque chose que vous envisagez, pensez fermement si une classe peut ne pas être la meilleure approche ici, si c'est la vôtre type.

Type de valeur vs type de référence Exemples Liés