Supposons le code suivant, sans aucun mot clé ref code>, qui ne remplacera évidemment pas la variable passée, car elle est transmise en tant que valeur.
class ProgramIntArray
{
public static void Test(int[] ia) // Pass by Value
{
ia[0] = 2; // Working as reference?
}
static void Main(string[] args)
{
int[] test = new int[] { 1 };
ProgramIntArray.Test(test);
Console.WriteLine(test[0]);
Console.Read();
// Output: 2
}
}
6 Réponses :
Pouvez-vous imaginer passer un tableau de 2 millions d'éléments par valeur? Maintenant, imaginez que le type d'élément est décimal code>. Vous devrez copier sur
240 Mo Strike> 30.5175781MB de données. P>
Non, les tableaux sont des cours, ce qui signifie qu'ils sont des types de référence. p>
Normalement, vous pouvez appuyer sur F12 sur n'importe quel type pour le savoir. Si la déclaration indique "classe", c'est un type de référence; Si cela indique "STRIT", c'est un type de valeur. Malheureusement, cela ne vous permet pas de faire cela avec des tableaux, qui est dommage. Donc, il vous suffit de vous rappeler que les tableaux sont des types de référence, même s'il s'agit d'un tableau de type de valeur.
Pour ajouter à ce que Timwi a dit, F12 est la touche de raccourci pour Visual Studio.
J'allais mentionner system.array code>, mais je me suis rappelé que
system.valueType code> et
system.enum code> sont également des types de référence, et pourtant le Les types de valeur et les énumjets qui en dérivent logiquement ne sont pas.
Les tableaux ne sont pas passés par référence. Les références aux tableaux sont transmises par la valeur. S'il est nécessaire de modifier ce que la variable de variable de réseau transbordée est (par exemple pour modifier la taille de la matrice), la variable doit être transmise par référence. P>
Autre des types de données de base Vous ne pouvez rien transmettre d'autre chose en tant que valeur de la valeur, le tableau est la collecte de types de données de base permettant également de passer par la valeur de la collection créerait plusieurs copies de collection qui seraient mauvaises sur la performance. p>
Les structures ne sont pas des "types de données de base" et ils sont passés par la valeur.
Un bon moyen de se rappeler que c'est: p>
Lorsque vous passez une matrice normalement, vous passez une collection de variables em>. Les variables de la collection ne changent pas. P>
Lorsque vous passez une matrice avec "REF", vous êtes donner un nouveau nom à la variable contenant le tableau em>. p>
Lorsque vous passez un élément de tableau normalement, vous passez la valeur de la variable em>. p>
Lorsque vous passez un élément de tableau - une variable - avec "REF", vous êtes donner un nouveau nom à cette variable em>. p>
sens? p>
Personnellement, j'aime ceci au-dessus de dire des adresses mais toujours la plupart des gens ne l'obtiennent pas. Voici une façon dont je l'ai décrit en utilisant un chien comme analogie, mais il semble vraiment boiteux: Stackoverflow.com/Questtions/3366650/...
Personnellement, je n'aime pas le phrasé de "donner un nouveau nom". Pour une raison quelconque, ça ne sonne pas avec moi. Mais je ne sais pas comment des novices le perçoivent.