Я думаю, что хорошо создавать новый тип, когда имеет смысл ввести новый набор значений в вашу программу. Например, если вы пишете сложный калькулятор, то создайте тип комплексного числа. Если вы действительно просто хотите на мгновение «склеить» несколько переменных, тогда кортеж, вероятно, будет лучшим выбором. Допустим, у вас есть простая функция, которая собирает два числа с консоли ... вы можете сделать что-то вроде:
static void GetNumbers(out int x, out int y) { ... }
...
int x, y;
GetNumbers(out x, out y);
Я думаю, что обычно имеет смысл, когда функция "getter" имеет возвращаемое значение, но в этом случае это не так, потому что я не могу иметь два возвращаемых значения. Я мог бы пойти и создать новый тип с именем TwoNumbers и использовать его, но я думаю, что это быстро становится скорее проблемой, чем решением. Если в C # есть кортежи, я могу сделать что-то вроде следующего:
static (int, int) GetNumbers() { ... }
...
int x, y;
(x, y) = GetNumbers();
Теперь действительно интересный вопрос: хотя в C # нет этой функции, могу ли я реализовать ее самостоятельно с помощью библиотеки? Код, который вы предлагаете, является началом, но не позволяет мне назначать, как я сделал во втором примере. Я не уверен насчет C #, но вы можете быть очень близки к этому в C ++, используя тот факт, что вызов функции может быть левым операндом оператора присваивания, когда его возвращаемое значение является ссылочным типом . Учтите следующее:
// this class is implemented much like yours only with C++
template<typename T1, typename T2> class tuple { ... }
...
template<typename T1, typename T2> tuple<T1, T2>& tie(T1 a, T2 b) { ... }
...
template<typename T1, typename T2> tuple<T1, T2> get_numbers() { ... }
...
int x, y;
tie(x, y) = get_numbers();
Я бы сказал, что это чертовски близко ... вместо (x, y) =
у нас есть tie(x, y) =
. Если вас интересуют подробности реализации, я отправлю вас в библиотеку TR1, где я впервые узнал об этом:
http://www.boost.org/doc/libs/1_41_0/libs/tuple/doc/tuple_users_guide.html#tiers
Итак, чтобы вернуть все это обратно в C # 3.0 ... мы, конечно, можем создать общий класс кортежей, как вы показали, но можем ли мы создать функцию типа tie, чтобы "распаковать" кортеж в C #? Я не пробовал, звучит как весело. Без чего-то подобного я бы не хотел, чтобы библиотека кортежей C # распространялась через мой код.