Je sais qu'un int est un type valeur, mais que sont les tableaux de types valeur? Types de référence? Types de valeur? Je veux passer un tableau à une fonction pour vérifier quelque chose. Dois-je simplement passer le tableau, car il passera simplement la référence de celui-ci, ou devrais-je le passer comme ref?
124
Réponses:
https://msdn.microsoft.com/en-us/library/bb985948.aspx
la source
Le test le plus simple pour le type de référence par rapport au type de valeur est que les types de référence peuvent l'être
null
, mais pas les types de valeur.la source
Les tableaux (même des types valeur comme int) sont des types de référence en C #.
http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx :
la source
Tout d'abord, je veux vous dire que Array est un type de référence. Pourquoi? J'explique jeter un exemple ici.
Exemple:
Les types de référence peuvent également être nuls, contrairement aux types valeur.
type de valeur stocké dans Stack et type de référence stocké dans Heap
Vous pouvez passer array pour fonctionner en utilisant out ou ref. Seules les méthodes d'initialisation sont différentes.
plus..
la source
Testez pour vérifier s'il s'agit d'un type de référence ou de valeur:
Vous pouvez le tester en ligne: https://dotnetfiddle.net/UWFP45
la source
Le tableau lui-même est un type de référence. Les valeurs de ce tableau sont des types valeur ou référence tels que déterminés par le type de données du tableau. Dans votre exemple, le tableau est un type référence et les valeurs sont des types valeur.
Tous les tableaux à une dimension implémentent implicitement
IList<T>
, où<T>
est le type de données du tableau. Vous pouvez utiliser cette interface comme type de données de votre paramètre de méthode à la place. Vous pouvez également utiliserIEnumerable<T>
pour le type de données. Dans les deux cas (ou même si vous utilisez simplementint[]
), vous ne devriez pas avoir besoin de le passer explicitement en tant queref
paramètre.la source
// La référence au tableau est passée par valeur. C'est la source de la confusion :-) ...
la source
Les tableaux sont toujours des types de référence, peu importe que le tableau contienne un type de valeur comme int ou un type de référence comme string.When vous déclarez array par exemple
int[] integers=new int[10]
;La variable integers elle-même ne contient que la référence au tableau qui résidera dans le tas.
De plus, de nombreuses personnes mentionnent que vous pouvez différer le type de valeur du type de référence simplement en fonction du fait que la variable peut être nulle ou non. Je voudrais mentionner que dans le c # actuellement, les types de valeur peuvent également être null
par exemple
et ce n'est pas un bon moyen d'identifier le type est une référence ou la valeur dépend uniquement du fait que la variable peut être nulle ou non.
la source
Juste un aperçu:
Par exemple,
int
représente un seul entier,int[]
représente un tableau d'entiers.Pour initialiser le tableau avec des dimensions spécifiques, vous pouvez utiliser le
new
mot - clé, en indiquant la taille entre crochets après le nom du type:Tous les tableaux sont des types de référence et suivent la sémantique de référence. Par conséquent, dans ce code, même si les éléments individuels sont des types de valeur primitifs, le
integers
tableau est un type de référence. Donc, si vous écrivez plus tard:cela affectera simplement la totalité de la copie de la variable pour faire référence au même tableau, cela ne créera pas de nouveau tableau.
La syntaxe de tableau de C # est flexible, elle vous permet de déclarer des tableaux sans les initialiser afin que le tableau puisse être dimensionné dynamiquement plus tard dans le programme. Avec cette technique, vous créez essentiellement une référence nulle et vous pointez plus tard cette référence vers une étendue allouée dynamiquement d'emplacements de mémoire demandés avec un
new
mot - clé:Merci.
la source