C # - я должен использовать «ref» для передачи коллекции (например, список) по ссылке на метод? - PullRequest
36 голосов
/ 13 августа 2010

Должен ли я использовать «ref» для передачи переменной списка посредством ссылки на метод?

Является ли ответ, что «ref» не нужен (поскольку список будет ссылочной переменной), однако для простотыв удобочитаемости поставить "реф" в?

Ответы [ 3 ]

55 голосов
/ 13 августа 2010

Словарь является ссылочным типом, поэтому невозможно передать его по значению, хотя ссылки на словарь являются значениями. Позвольте мне попытаться прояснить это:

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
}
24 голосов
/ 13 августа 2010

Нет, не используйте ссылку, если вы не хотите изменить список, на который ссылается переменная. Если вы хотите просто получить доступ к списку, сделайте это без ссылки.

Если вы сделаете параметр ref, вы говорите, что вызывающая сторона должна ожидать, что передаваемый им параметр может быть назначен другому объекту. Если вы этого не делаете, значит, он не передает правильную информацию. Вы должны предположить, что все разработчики C # понимают, что ссылка на объект передается.

9 голосов
/ 13 августа 2010

Вам не нужен ref в вашем сценарии, и это не поможет с удобочитаемостью.

ref используется только в том случае, если вы намереваетесь изменить то, на что ссылается переменная, а не содержимое объекта, на который она ссылается. Имеет ли это смысл?

...