Просто мысль, я считаю ref / out полезной, когда аргументы фиксируют состояние выполнения в целевом методе, а не захватывают возвращаемые данные. Рассмотрим сценарий, когда вы хотите получить сообщение об ошибке от службы, которая возвращает объект Customer.
Customer GetCustomerById(int id, out string errorMessage);
В случае сбоя этого метода вы, вероятно, вернете нулевой объект Customer или сгенерируете исключение. Однако, если я хочу узнать причину ошибки (проверка? База данных?), Я бы использовал аргумент out. Аргумент errorMessage здесь не имеет ничего общего с данными, просто используется для определения того, что не так с выполнением метода.
Лично, если у меня есть метод, который должен возвращать два или более важных данных / значения, я бы переосмыслил дизайн своего кода.