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


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

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

обновление

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

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

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

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

Это правильно?

13 93

13 ответов:

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

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

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#. Если у кого-нибудь есть какие-либо мысли о том, какие функции с участием кортежей вы хотели бы видеть, я был бы рад передать их команде дизайнеров. Реалистичные сценарии более убедительны, чем теоретические размышления.

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

помимо общего использования кортежей:

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

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

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

с "Неизменяемого Объекта" Википедии

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

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

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

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

лично я считаю, что кортежи являются итеративной частью разработки, когда вы находитесь в исследовательском цикле или просто "играете". Поскольку Кортеж является общим, я склонен думать об этом при работе с общими параметрами - особенно при желании разработать общий фрагмент кода, и я начинаю с конца кода, вместо того, чтобы спрашивать себя: "как бы мне хотелось, чтобы этот вызов выглядел?".

довольно часто я понимаю, что коллекция, которую формирует Кортеж, становится частью списка и смотрит на Список> на самом деле не выражает намерения списка или как он работает. Я часто "живу" с ним, но обнаруживаю, что хочу манипулировать списком и изменять значение - в этот момент я не обязательно хочу создавать новый Кортеж для этого, поэтому мне нужно создать свой собственный класс или структуру для его хранения, чтобы я мог добавить код манипуляции.

конечно, всегда есть методы расширения - но довольно часто вы не хотите расширять этот дополнительный код до generic реализации.

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

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

Я обычно начинаю с того, что класс является публичным членом класса, в котором вы уже работаете. Но в тот момент, когда он выходит за рамки просто коллекции значений, он получает свой собственный файл, и я перемещаю его из содержащего класса.

Итак, оглядываясь назад, я считаю, что я использую кортежи, когда я не хочу уходить и писать класс, и просто хочу подумать о том, что я сейчас пишу. Это означает, что подпись Кортежа может сильно измениться в тексте за полчаса, пока я выясню, какие данные мне понадобятся для этого метода, и как он возвращает то, что когда-либо будет возвращено.

Если у меня будет возможность рефакторинга кода, то часто я буду подвергать сомнению место кортежа в нем.

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

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

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

старый вопрос с 2010 года, а теперь в 2017 году Dotnet меняется и становится более умным.

C# 7 вводит языковую поддержку кортежей, которая позволяет семантические имена для полей кортежа с использованием новых, более эффективных типов кортежей.

в vs 2017 и .Net 4.7(или установка системы пакетов nuget.ValueTuple), вы можете создать/использовать кортеж очень эффективным и простым способом:

     var person = (Id:"123", Name:"john"); //create tuble with two items
     Console.WriteLine($"{person.Id} name:{person.Name}") //access its fields

возврат более одного значения из a метод:

    public (double sum, double average) ComputeSumAndAverage(List<double> list)
    {
       var sum= list.Sum();
        var average = sum/list.Count;
        return (sum, average);
    }

    How to use:

        var list=new List<double>{1,2,3};
        var result = ComputeSumAndAverage(list);
        Console.WriteLine($"Sum={result.sum} Average={result.average}");    

Подробнее читайте:https://docs.microsoft.com/en-us/dotnet/csharp/tuples

Я нахожу обновление KeyValuePair в C# для итерации по парам значений ключей в словаре.

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

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

http://www.dotnetperls.com/tuple-keyvaluepair