РЕДАКТИРОВАТЬ: я добавляю резюме моей точки в верхней части, для удобства чтения:
Если ваш метод возвращает несколько частей данных, которые логически являются частью одной и той же «вещи», то определенно объедините их в сложный объект независимо от того, возвращаете ли вы этот объект в качестве возвращаемого значения или результата параметр.
Если вашему методу необходимо вернуть какой-либо статус (успех / неудача / количество обновленных записей / и т. Д.) В дополнение к данным, рассмотрите возможность возврата данных в качестве выходного параметра и использования возвращаемого значения для возврата статус
Существует два варианта ситуаций, к которым относится этот вопрос:
Необходимость возврата данных, состоящих из нескольких атрибутов
Необходимость возврата данных вместе со статусом действия, использованного для получения этих данных
Что касается # 1, я считаю, что если у вас есть данные, состоящие из нескольких атрибутов, которые все идут вместе, то они должны быть объединены в один тип как класс или структуру, и один объект должен быть возвращен либо как возвращаемый значение метода или как выходной параметр.
Для # 2, я думаю, что это тот случай, когда выходные параметры действительно имеют смысл. Концептуально методы обычно выполняют действие; в этом случае я предпочитаю использовать возвращаемое значение метода, чтобы указать состояние действия. Это может быть простое логическое значение, указывающее на успех или неудачу, или это может быть что-то более сложное, например, перечисление или строка, если существует несколько возможных состояний для описания действия, которое выполнял метод.
При использовании выходных параметров я бы посоветовал человеку использовать только один (см. Пункт # 1), если нет особых причин использовать более одного. Не используйте несколько выходных параметров просто потому, что данные, которые вам нужно вернуть, состоят из нескольких атрибутов. Используйте только несколько выходных параметров, если семантика вашего метода определенно его диктует. Ниже приведен пример, где я думаю, что несколько выходных параметров имеют смысл:
// an acceptable use of multiple output parameters
bool DetermineWinners(IEnumerable<Player> players, out Player first, out Player second, out Player third)
{
// ...
}
И наоборот, вот пример, где я думаю, что несколько выходных параметров не имеют смысла.
// Baaaaad
bool FindPerson(string firstName, string lastName, out int personId, out string address, out string phoneNumber)
{
// ...
}
Атрибуты данных (personId, address и phoneNumber) должны быть частью объекта Person, возвращаемого методом. Лучшая версия была бы следующей:
// better
bool FindPerson(string firstName, string lastName, out Person person)
{
// ...
}