90 votes

Les tableaux ou les listes sont-ils passés par défaut par référence en C# ?

Le font-ils ? Ou, pour accélérer mon programme, dois-je les passer par référence ?

37 votes

Pour accélérer votre programme, vous devez (1) fixer des objectifs significatifs, (2) tester pour voir si vous avez atteint vos objectifs, (3) si ce n'est pas le cas, utiliser un outil de profilage pour trouver le point le plus lent, et (4) optimiser le point le plus lent.

1 votes

4 votes

@EricLippert Votre commentaire répond à la vraie question du PO bien mieux que toutes les réponses affichées. Tout le monde a été tellement distrait par les détails techniques de "passer la référence par valeur" qu'ils ont complètement négligé la vraie question sur l'optimisation des performances. Malheureusement, le PO a mal communiqué ses besoins, et les autres réponses aideront au moins les utilisateurs de Google.

221voto

Marc Gravell Points 482669

El référence est passé par valeur .

Les tableaux dans .NET sont des objets sur le tas, vous avez donc une référence. Cette référence est transmise par valeur, ce qui signifie que les changements apportés à l'objet contenu du tableau sera vu par l'appelant, mais réaffectation de le tableau ne le fera pas :

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}

Si vous ajoutez le ref le modificateur référence est passé par référence - et l'appelant verrait l'un ou l'autre des changements ci-dessus.

28 votes

La réponse est correcte mais je déteste les personnes qui déclarent "la référence est transmise par valeur". Cela brouille les pistes. Oui, les références (adresses mémoire) sont transmises par valeur mais ce n'était pas la question.

11 votes

@WernerVA Je suis intéressé par la façon dont vous pensez que vous l'exprimeriez différemment que les autres. correct y sans ambiguïté

2 votes

Je ne l'exprimerais pas différemment, mais peut-être avec un peu plus de détails.

11voto

plinth Points 26817

Ils sont transmis par valeur (comme tous les paramètres qui ne sont ni ref ni out), mais la valeur est une référence à l'objet, donc ils sont effectivement passés par référence.

8voto

Jason Punyon Points 21244

Voici L'article de Jon Skeet sur le passage des paramètres en C#. Il le dit mieux que moi.

0voto

Paul Sonier Points 25528

Oui, ils sont passés par référence par défaut en C#. Tous les objets en C# le sont, à l'exception des types de valeurs. Pour être un peu plus précis, ils sont transmis "par référence par valeur", c'est-à-dire que la valeur de la variable que vous voyez dans vos méthodes est une référence à l'objet original transmis. Il s'agit d'un petit point sémantique, mais qui peut parfois être important.

9 votes

La référence est transmise par valeur, ce qui est très différent de "ils sont transmis par référence".

1 votes

C'est exactement le contraire de la vérité. Citation de ce message de John Skeet : " Par défaut, tous les paramètres sont passés par valeur en C#. Les paramètres ne sont transmis par référence que si vous incluez explicitement un modificateur out ou ref. Cependant, vous devez être conscient que lorsque le type du paramètre est un type de référence, vous passez une référence plutôt qu'un objet réel". C'est uniquement la référence (l'adresse mémoire) qui est transmise par valeur.

0voto

Ray Points 1234

Un tableau est une référence. Et il est transmis par valeur.

Prograide.com

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.

Powered by:

X