Синтаксис C # - Ваша предпочтительная практика для получения 2 или 3 ответов от метода - PullRequest
8 голосов
/ 03 декабря 2008

Мне просто интересно, как другие разработчики решают эту проблему получения 2 или 3 ответов от метода.

1) вернуть объект []
2) вернуть пользовательский класс
3) используйте ключевое слово out или ref для нескольких переменных
4) написать или позаимствовать (F #) простой универсальный класс Tuple <>
http://slideguitarist.blogspot.com/2008/02/whats-f-tuple.html

Сейчас я работаю над кодом, который обновляет данные. Из метода, который выполняет обновление, я хотел бы передать обратно (1) время начала обновления и (2) время окончания обновления.
Позже я могу захотеть вернуть третье значение.

Мысли? Какие-нибудь хорошие практики от проектов с открытым исходным кодом .NET на эту тему?

Ответы [ 16 ]

1 голос
/ 03 декабря 2008

Я думаю, что наиболее распространенный способ, которым программист C # мог бы сделать это, - это обернуть элементы, которые вы хотите вернуть, в отдельный класс. Это обеспечит вам максимальную гибкость в будущем, ИМХО.

1 голос
/ 03 декабря 2008

Я использую, если это только 1 или 2 дополнительные переменные (например, функция возвращает bool, который является действительно важным результатом, но также и long как параметр out, чтобы возвращать, как долго выполнялась функция, для целей регистрации) .

Для чего-то более сложного я обычно создаю собственную структуру / класс.

0 голосов
/ 20 декабря 2008

Если метод выводит два-три связанных значения, я бы сгруппировал их по типу. Если значения не связаны, метод, скорее всего, делает слишком много, и я бы реорганизовал его в ряд более простых методов.

0 голосов
/ 20 декабря 2008

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

Для частных методов я обычно просто использую Tuple из моей библиотеки классов.

Для открытых / защищенных / внутренних методов (т. Е. Не приватных) я использую либо параметр out, либо пользовательский класс.

Например, если я реализую шаблон TryXYZ, где у вас есть метод XYZ, который вызывает исключение при сбое, и метод TryXYZ, который возвращает логическое значение, TryXYZ будет использовать параметр out.

Если результаты ориентированы на последовательность (т. Е. Вернуть 3 клиентов, которые должны быть обработаны), тогда я обычно возвращаю какую-то коллекцию.

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

0 голосов
/ 03 декабря 2008

Другое решение - вернуть словарь ссылок на именованные объекты. Для меня это довольно эквивалентно использованию пользовательского класса возврата, но без беспорядка. (И используя RTTI и отражение, он так же безопасен, как и любое другое решение, хотя и динамически).

0 голосов
/ 03 декабря 2008

Если 2, пара.

Если более 2 класса.

...