web-dev-qa-db-fra.com

c # - dois-je utiliser "ref" pour transmettre une collection (par exemple, List) par référence à une méthode?

Dois-je utiliser "ref" pour passer une variable de liste par référence à une méthode?

La réponse est-elle que "ref" n'est pas nécessaire (car la liste serait une variable de référence), mais pour plus de lisibilité, mettez "ref" dedans?

37
Greg

Non, n'utilisez pas de référence sauf si vous souhaitez modifier la liste à laquelle la variable fait référence. Si vous souhaitez simplement accéder à la liste, faites-le sans ref.

Si vous faites une référence de paramètre, vous dites que l'appelant doit s'attendre à ce que le paramètre qu'il transmet puisse être attribué à un autre objet. Si vous ne le faites pas, cela ne transmet pas les informations correctes. Vous devez supposer que tous les développeurs C # comprennent qu'une référence d'objet est transmise.

29
Lou Franco

Un dictionnaire est un type de référence, il n'est donc pas possible de passer par valeur, bien que les références à un dictionnaire soient des valeurs. Permettez-moi d'essayer de clarifier cela:

void Method1(Dictionary<string, string> dict) {
    dict["a"] = "b";
    dict = new Dictionary<string, string>();
}

void Method2(ref Dictionary<string, string> dict) {
    dict["e"] = "f";
    dict = new Dictionary<string, string>();
}

public void Main() {
    var myDict = new Dictionary<string, string>();
    myDict["c"] = "d";

    Method1(myDict);
    Console.Write(myDict["a"]); // b
    Console.Write(myDict["c"]); // d

    Method2(ref myDict); // replaced with new blank dictionary
    Console.Write(myDict["a"]); // key runtime error
    Console.Write(myDict["e"]); // key runtime error
}
62
recursive

Vous n'avez pas besoin de ref dans votre scénario, et cela n'aidera pas à la lisibilité.

ref n'est utilisé que si vous avez l'intention de modifier ce à quoi fait référence la variable, pas le contenu de l'objet auquel elle fait référence. Cela a-t-il du sens?

11
Esteban Araya