Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > распаковка кортежей в .NET4


Автор: GoldFinch 12.5.2010, 13:09
В .NET 4 ввели кортежи (System.Tuple)
Я правильно понимаю, что нет способа распаковать кортеж, как например в С++

Код

int x;
string s;
tie(x, s) = make_tuple(42, "test");


т.е. можно только извлекать из него данные по одному?

Автор: diadiavova 12.5.2010, 16:52
Класс System.Tuple содержит статические методы для создания кортежей, а сами кортежи являются экземплярами типов System.Tuple<T1>, System.Tuple<T1, T2> и тд. А у них есть соответствующие свойства.

Автор: GoldFinch 13.5.2010, 08:18
diadiavova, свойства это не то, я хочу сразу извлекать данные из кортежа в переменные

через свойства это
Код

var t = func_rets_tuple();
int x = t.item1;
string s = t.item2;


а я хочу что-то вроде
Код

int x = 0;
string s = null;
tie(ref x, ref s) = func_rets_tuple();

хотя в С# тут преимуществ мало =\
переменные должны быть заранее объявлены и инициализированы, надо явно указывать "ref"

но в ряде случаев это все равно было бы удобнее, когда переменные уже где-то объявлены

Автор: diadiavova 13.5.2010, 08:25
Вообще-то, на сколько я понимаю кортежи в дотнете появились для взаимодействия с кодом, написанным на F#. В самом C# вместо них лучше использовать анонимные типы. То, о чём ты пишешь в том или ином виде реализовать можно, только мне не вполне понятно зачем. Ну если очень надо, просто напиши метод, в котором первым параметром будет кортеж, а остальными - переменные и все дела, но только к чему всё это?

Автор: GoldFinch 13.5.2010, 14:15
diadiavova, кортежи сами по себе удобны, когда надо из функции вернуть несколько значений

жаль конечно что в C# они так криво сделаны
может в .NET5 их пофиксят =)

Автор: diadiavova 13.5.2010, 19:56
Цитата(GoldFinch @  13.5.2010,  15:15 Найти цитируемый пост)
жаль конечно что в C# они так криво сделаны
может в .NET5 их пофиксят =) 

Не пофиксят, я уже написал, что в шарпе для этих же целей существуют анонимные типы, вводить в язык ещё одну сущность, аналогичную существующей, да ещё и менее удобную(в контексте языка) никто не будет.
http://msdn.microsoft.com/ru-ru/library/bb397696(VS.90).aspx

Автор: GoldFinch 14.5.2010, 09:20
diadiavova, ни у System.Tuple, ни у анонимных типов, нет средств для одновременного присвоения их содержимого нескольким переменным, как я хотел бы

Автор: diadiavova 14.5.2010, 09:24
Тогда опиши ситуацию, зачем тебе это надо. Обычно если требуется, чтобы метод возвращал несколько значений, используют аут-параметры, если тебе нужен отдельный объект, то тут анонимные типы, но вот в какой ситуации то, что ты хочешь может оказаться более удобным, мне ,честно говоря, представить себе трудно. Может ты вообще не туда копаешь?

Автор: GoldFinch 15.5.2010, 11:23
diadiavova, наверное действительно дело во мне, я хочу писать на C# так же как писал раньше на С++ и питоне.
увидел знакомое слово tuple - и обрадовался)

в самом деле, out параметры - то что надо для возврата нескольких значений

Автор: Exception 17.5.2010, 14:52
Ну да, для человека с функциональным бэкграундом кортежи (сразу вспоминаю крестражи из Гарри Поттера, лол) — привычный способ возврата нескольких значений.  С другой стороны, в C# для этого используются out-параметры, а tuples поддерживаются скорее ради F# и некоторых случаев, когда надо оперировать подобными элементами.
В MSDN Magazine хорошо написано, почему класс System.Tuple такой, какой он есть:
http://msdn.microsoft.com/en-us/magazine/dd942829.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)