Я смотрю на новую функцию C# кортежей. Мне любопытно, какую проблему кортеж был разработан для решения?
Для чего Вы использовали кортежи в Ваших приложениях?
Обновление
Спасибо за ответы к настоящему времени, позвольте мне видеть, есть ли у меня вещи прямо в моем уме. На хороший пример кортежа указали как координаты. Это выглядит правильным?
var coords = Tuple.Create(geoLat,geoLong);
Затем используйте кортеж как так:
var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");
Это корректно?
При написании программ очень часто возникает желание логически сгруппировать набор значений, которые не имеют достаточной общности, чтобы оправдать создание класса.
Многие языки программирования позволяют логически сгруппировать набор значений, не связанных друг с другом, без создания типа только одним способом:
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 #. Если у кого-то есть какие-либо мысли о том, какие функции, связанные с кортежами, вы хотели бы видеть, я был бы счастлив передать их команде разработчиков.Реалистичные сценарии более убедительны, чем теоретические размышления.
Я обнаружил, что KeyValuePair обновляется в C # для перебора пар ключ-значение в Словаре.
Он предоставляет альтернативу ref
или out
, если у вас есть метод, который должен вернуть несколько новых объектов в качестве части своего ответа.
Это также позволяет использовать встроенный тип в качестве возвращаемого типа, если все, что вам нужно сделать, это объединить два или три существующих типа, и вы не хотите добавлять класс/структуру только для этой комбинации. (Вы когда-нибудь хотели, чтобы функция возвращала анонимный тип? Это частичный ответ на такую ситуацию.)
.Часто бывает полезно иметь тип «пара», который просто используется в быстрых ситуациях (например, при возврате двух значений из метода). Кортежи - это центральная часть функциональных языков, таких как F #, и C # взял их на вооружение.
Обычно используется, чтобы избежать создания классов / структур, содержащих только 2 поля, вместо этого вы создаете Tuple (или KeyValuePair на данный момент). Полезно в качестве возвращаемого значения, избегайте передачи N параметров ...
Кортеж часто используется для возврата нескольких значений из функций, когда вы не хотите создавать определенный тип. Если вы знакомы с Python, в Python это было давно.
Кортежи обеспечивают неизменяемую реализацию коллекции
Помимо обычных применений кортежей:
Неизменяемые объекты по своей сути потокобезопасны:
Неизменяемые объекты могут быть полезны в многопоточных приложениях. Несколько потоков могут действовать с данными, представленными неизменяемыми объектами, не опасаясь, что данные будут изменены другими потоками. Поэтому неизменяемые объекты считаются более безопасными для потоков, чем изменяемые объекты.
Из "Immutable Object" в Википедии
Возвращение более одного значения из функции. getCoordinates() не очень полезна, если она возвращает только x или y или z, но создание полного класса и объекта для хранения трех ints также кажется довольно тяжеловесным.