Лучшая практика: параметр ref или возвращаемое значение? - PullRequest
11 голосов
/ 21 ноября 2011

На самом деле я делаю список в качестве справочного параметра следующим образом:

public static List ListMethod(List result)

Я видел, что некоторые люди тоже так поступают:

public static void ListMethod(ref List result)

Если я не ошибаюсь, «мой» метод также принимает list в качестве ссылочного параметра, и вы должны иметь возможность использовать его точно так же, как «другие» в своем методе.

Но он кажется более «чистым» длямне, что вы вводите параметр, что-то с ним делаете и возвращаете в методы возвращаемое значение.

Есть ли веские аргументы за или против одного или другого метода?

Ответы [ 4 ]

33 голосов
/ 21 ноября 2011

Это вероятно , что вам не нужно использовать ref - но есть разница.

Обычно, когда я вижу людей, использующих ref для параметров ссылочного типа, это происходит потому, что они не понимают, как работает передача параметров. Но если ваш метод имеет что-то вроде этого:

result = new List();
...

тогда в первом случае вызывающая сторона не увидит изменения, тогда как во втором случае переменная вызывающей стороны будет изменена для ссылки на новый объект.

Смотрите мою статью о передаче параметров для более подробной информации.

12 голосов
/ 21 ноября 2011

Нет, ваш метод не использует параметр ref. По умолчанию pass by value.

Разница в том, что ваш метод может просто изменять содержимое вашего списка, но не ссылку на параметр, на который указывает result.

Каков наилучший подход? Это зависит от того, что должен делать ваш метод.

Когда ваш метод изменяет список или возвращает новые данные, вы должны использовать возвращаемое значение. Намного лучше понять, что делает ваш код, чем использовать параметр ref.

Еще одним преимуществом возвращаемых значений является возможность использования метода цепочки.

Вы можете написать такой код, который передает параметр списка от одного метода к другому:

ListMethod1(list).ListMethod2(list)...
3 голосов
/ 21 ноября 2011

Если вы просто возвращаете список, вы всегда должны использовать первый, поскольку он показывает это намерение.

Версия с ref говорит мне, что я могу начать со списка, и вашМетод изменит список, который я отправил, или даже изменит его на другой.Если это ваше намерение, сделайте это.

Но если метод всегда возвращает новый список, используйте возвращаемое значение вместо параметра ref.

Примечание на стороне : вы могли бы использовать out вместо ref, чтобы показать свои намерения вернуть новый список, но это хорошая практика, если вы используете возвращаемое значение для чего-то другого.

1 голос
/ 21 ноября 2011

Особенностью ref-параметра здесь является то, что - «Переменной, переданной с ref, сначала должно быть присвоено значение».Поэтому, если вы хотите, чтобы вызывающий метод строго присваивал значение перед вызовом, вы можете использовать ref Parameters.

...