Подтвердить что ты не робот

Tuple.Create() vs new Tuple

Рассмотрим следующее:

Tuple<int, int> t1 = new Tuple<int,int>(1,2);
Tuple<int, int> t2 = Tuple.Create(1,2);

Есть ли разница между этими двумя методами создания Tuple? Из моего чтения это кажется более удобным сокращением, чем что-либо вроде создания объекта в С++ (heap vs stack).

4b9b3361

Ответ 1

Хорошо, эти вопросы старые... но тем не менее я думаю, что могу внести конструктивный вклад. Из принятого ответа:

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

Следствие верно: вы можете хранить анонимные типы, для которых...

Но первая часть:

так как вам не нужно указывать тип с помощью Tuple.Create

не всегда верно. Рассмотрим следующий сценарий:

interface IAnimal
{
}

class Dog : IAnimal
{
}

Следующие команды не будут компилироваться:

Tuple<IAnimal> myWeirdTuple;

myWeirdTuple = Tuple.Create(new Dog());

Вам нужно будет указать параметр типа в методе Create, например:

myWeirdTuple = Tuple.Create<IAnimal>(new Dog());

который является таким же подробным, как вызов new Tuple<IAnimal>(new Dog()) IMO

Ответ 2

Лично я нахожу Tuple.Create() менее подробным и более легким для чтения.

Там нет разницы, под капотом. Перегруженные методы Tuple.Create() представляют собой всего лишь кучу статических методов, которые вызывают первую опубликованную версию:

public static class Tuple
{
    public static Tuple<T1> Create<T1>(T1 item1) {
        return new Tuple<T1>(item1);
    }

    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new Tuple<T1, T2>(item1, item2);
    }

    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) {
        return new Tuple<T1, T2, T3>(item1, item2, item3);
    }

    ...

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

public class Person
{
    public string Name { get; set; }
    public int Height { get; set; }
    public DateTime BirthDate { get; set; }
}

var people = new List<Person>
{
    new Person { Name = "Bob", Height = 72, BirthDate = new DateTime(1984,1,1) },
    new Person { Name = "Mary", Height = 64, BirthDate = new DateTime(1980,2,2) }
};

var oneAnonList = people.Select(x => new { x.Name, x.BirthDate });
var twoAnonList = people.Select(x => new { x.Height, x.Name });

var myTuple = Tuple.Create(oneAnonList, twoAnonList);

Это создает кортеж с двумя анонимными типами, первый - new { string Name, DateTime BirthDate }, а второй - new { int Height, string Name }.

С этим все еще не так уж много, потому что, чтобы передать его другому методу, вам все равно нужно будет определить "тип" этого параметра. Так что это действительно подходит для удобства.

Ответ 3

Преимущество использования Tuple.Create() заключается в том, что вам необязательно указывать типы нового Tuple как с new Tuple<T1,T2>(*,*). С первым вариантом это действительно:

var newTuple = Tuple.Create(1,2);

Ответ 4

Нет никакой разницы. Если вы посмотрите на исходный код, он делает то же самое.

http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,9124c4bea9ab0199

Например:

Tuple.create(1,2); 

собирается называть

   public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
        return new Tuple<T1, T2>(item1, item2);
    }