2 votes

Affectation d'une valeur à une liste passée par référence

Je suis en train de comprendre le mécanisme suivant.

List list = new List();
list.Add("test");

NewLines(list);
Console.WriteLine(list.Count) // le résultat est 1 et non pas 0

ClearLines(list);
Console.WriteLine(list.Count) // le résultat est 0

private static void NewLines(List lines)
{
    lines = new List();
}

private static void ClearLines(List lines)
{
    lines.Clear();
}    

Si les arguments en C# sont passés par référence alors pourquoi la liste n'est-elle pas vide après avoir appelé NewLines(list); ?

3voto

D Stanley Points 54768

Les arguments sont toujours passés par valeur sauf si le mot-clé ref ou out est utilisé. Ce qui est potentiellement déroutant, c'est que list est une référence (car List est un type de référence). Donc lorsque vous passez list, vous passez la valeur de la référence. Si vous modifiez sa valeur dans la fonction, vous ne faites que changer la variable locale pour une nouvelle liste - cela n'affecte pas la variable passée en argument.

Donc pour que le code se comporte comme vous l'attendez, il suffit d'ajouter le mot-clé ref:

private static void NewLines(ref List lines)
{
    lines = new List();
}

Je noterais cependant que retourner des valeurs est préférable par rapport aux mots-clés ref

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