2015-03-09 2 views
2

Есть ли какие-либо рекомендации, когда я должен использовать Tuple.Create() вместо нового Tuple()?Каковы преимущества/недостатки между Tuple <X1,X2..>. Создайте и новый Tuple <X1,X2..>

Должна быть причина, по которой Microsoft имеет 2 способа создания одного и того же объекта. Различия в скорости или другие известные преимущества/недостатки?

+0

Привет @ shev72, проверьте эту ссылку http: // stackoverflow.com/questions/3089706/what-require-was-the-tuple-designed-to-solve – Vikrant

+1

Лучшим вариантом для проверки отличий в производительности является бенчмаркинг. –

ответ

3

К сожалению, в конструкторах C# не нужно вводить тип вывода. Таким образом, вы не можете писать:

Tuple<int, int> xxx = new Tuple(1, 2); 

в то время как методы сделать это:

Tuple<int, int> xxx = Tuple.Create(1, 2); 

для использования конструкторами вам нужно:

Tuple<int, int> xxx = new Tuple<int, int>(1, 2); 

Это более многословным.

Обратите внимание, что если определение типа не работает для вас (потому что вы хотите кортеж другого типа, чем параметры вы проходящие):

Tuple<object, object> xxx = Tuple.Create("A", "B"); // Invalid 

, то они эквивалентны за многословие:

Tuple<object, object> xxx = Tuple.Create<object, object>("A", "B"); 

Tuple<object, object> xxx = new Tuple<object, object>("A", "B"); 

Tuple<object, object> xxx = Tuple.Create((object)"A", (object)"B"); 
2

Как видно из source codeTuple.Create(item1) просто звонит new Tuple<T1>(item1). Таким образом, между ними нет никакой разницы в скорости.

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

Таким образом, вы можете создать свою коллекцию с обоими способами:

Tuple<int> myTuple = Tuple.Create(1); // This one uses type inference 
Tuple<int> myTuple = new Tuple<int>(1); 

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

Tuple<int> myTuple = new Tuple(1); // Oops, compiler error 

Таким образом, вместо того, чтобы писать код выше, мы можем записать это благодаря Create() методу:

Tuple<int> myTuple = Tuple.Create(1); 


К путь, вы можете прочитать Eric Lippert's answer для получения дополнительной информации, если вы хотите знать, почему конструктор C# не может вывести тип.

+0

Конструктор, скорее всего, будет работать быстрее, потому что вызов 'Create' может не получить' inline'd. –

+0

@BinkanSalaryman IMO, нет разницы в скорости. –

+0

Разница незначительна - нет необходимости в преждевременной оптимизации. –

2

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

Смежные вопросы