Это зависит от типа и значения результатов, а также от того, является ли метод закрытым или нет.
Для частных методов я обычно просто использую Tuple из моей библиотеки классов.
Для открытых / защищенных / внутренних методов (т. Е. Не приватных) я использую либо параметр out, либо пользовательский класс.
Например, если я реализую шаблон TryXYZ, где у вас есть метод XYZ, который вызывает исключение при сбое, и метод TryXYZ, который возвращает логическое значение, TryXYZ будет использовать параметр out.
Если результаты ориентированы на последовательность (т. Е. Вернуть 3 клиентов, которые должны быть обработаны), тогда я обычно возвращаю какую-то коллекцию.
Кроме этого, я обычно использую собственный класс.