Какое требование кортеж был разработан для решения?

Я смотрю на новую функцию C# кортежей. Мне любопытно, какую проблему кортеж был разработан для решения?

Для чего Вы использовали кортежи в Ваших приложениях?

Обновление

Спасибо за ответы к настоящему времени, позвольте мне видеть, есть ли у меня вещи прямо в моем уме. На хороший пример кортежа указали как координаты. Это выглядит правильным?

var coords = Tuple.Create(geoLat,geoLong);

Затем используйте кортеж как так:

var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");

Это корректно?

94
задан SteveC 17 May 2013 в 10:01
поделиться

9 ответов

При написании программ очень часто возникает желание логически сгруппировать набор значений, которые не имеют достаточной общности, чтобы оправдать создание класса.

Многие языки программирования позволяют логически сгруппировать набор значений, не связанных друг с другом, без создания типа только одним способом:

void M(int foo, string bar, double blah)

Логически это в точности то же самое, что и метод M, который принимает один аргумент, который представляет собой 3-кортеж. из int, string, double. Но я надеюсь, что вы на самом деле не сделаете:

class MArguments
{
   public int Foo { get; private set; } 
   ... etc

, если только аргументы не будут иметь какое-то другое значение в бизнес-логике.

Концепция «сгруппировать вместе набор не связанных друг с другом данных в некую структуру, более легкую, чем класс», полезна во многих, многих местах, а не только для формальных списков параметров методов. Это полезно, когда метод имеет две вещи, которые нужно вернуть, или когда вы хотите создать словарь из двух данных, а не из одного, и так далее.

Такие языки, как F #, которые изначально поддерживают типы кортежей, обеспечивают большую гибкость для своих пользователей; они представляют собой чрезвычайно полезный набор типов данных. Команда BCL решила работать с командой F # над стандартизацией одного типа кортежей для фреймворка, чтобы каждый язык мог получить от них пользу.

Однако на данный момент язык не поддерживает кортежи в C #. Кортежи - это просто еще один тип данных, как и любой другой класс фреймворка; в них нет ничего особенного. Мы рассматриваем возможность добавления улучшенной поддержки кортежей в гипотетических будущих версиях C #. Если у кого-то есть какие-либо мысли о том, какие функции, связанные с кортежами, вы хотели бы видеть, я был бы счастлив передать их команде разработчиков.Реалистичные сценарии более убедительны, чем теоретические размышления.

117
ответ дан 24 November 2019 в 06:06
поделиться

очень полезно для возврата двух значений из функции

5
ответ дан 24 November 2019 в 06:06
поделиться

Я обнаружил, что KeyValuePair обновляется в C # для перебора пар ключ-значение в Словаре.

0
ответ дан 24 November 2019 в 06:06
поделиться

Он предоставляет альтернативу ref или out, если у вас есть метод, который должен вернуть несколько новых объектов в качестве части своего ответа.

Это также позволяет использовать встроенный тип в качестве возвращаемого типа, если все, что вам нужно сделать, это объединить два или три существующих типа, и вы не хотите добавлять класс/структуру только для этой комбинации. (Вы когда-нибудь хотели, чтобы функция возвращала анонимный тип? Это частичный ответ на такую ситуацию.)

.
12
ответ дан 24 November 2019 в 06:06
поделиться

Часто бывает полезно иметь тип «пара», который просто используется в быстрых ситуациях (например, при возврате двух значений из метода). Кортежи - это центральная часть функциональных языков, таких как F #, и C # взял их на вооружение.

10
ответ дан 24 November 2019 в 06:06
поделиться

Обычно используется, чтобы избежать создания классов / структур, содержащих только 2 поля, вместо этого вы создаете Tuple (или KeyValuePair на данный момент). Полезно в качестве возвращаемого значения, избегайте передачи N параметров ...

1
ответ дан 24 November 2019 в 06:06
поделиться

Кортеж часто используется для возврата нескольких значений из функций, когда вы не хотите создавать определенный тип. Если вы знакомы с Python, в Python это было давно.

1
ответ дан 24 November 2019 в 06:06
поделиться

Кортежи обеспечивают неизменяемую реализацию коллекции

Помимо обычных применений кортежей:

  • для группировки общих значений вместе без необходимости создания класса
  • для возврата нескольких значений из функции/метода
  • и т.д....

Неизменяемые объекты по своей сути потокобезопасны:

Неизменяемые объекты могут быть полезны в многопоточных приложениях. Несколько потоков могут действовать с данными, представленными неизменяемыми объектами, не опасаясь, что данные будут изменены другими потоками. Поэтому неизменяемые объекты считаются более безопасными для потоков, чем изменяемые объекты.

Из "Immutable Object" в Википедии

22
ответ дан 24 November 2019 в 06:06
поделиться

Возвращение более одного значения из функции. getCoordinates() не очень полезна, если она возвращает только x или y или z, но создание полного класса и объекта для хранения трех ints также кажется довольно тяжеловесным.

1
ответ дан 24 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: