web-dev-qa-db-ja.com

Tuple.Create()と新しいTuple

次の式を考慮してください。

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

Tuple.Create(1,2);

タプル作成のこれら2つの方法に何か違いはありますか?私の読書から、C++でのオブジェクト作成(ヒープvsスタック)のようなものよりも便利な速記のようです。

39
chris

まあ、この質問は古い...しかしそれにもかかわらず、私は建設的に貢献できると思う。受け入れられた答えから:

Tuple.Createで型を指定する必要がないため、そうでないと型がわからない匿名型を保存できるという利点があると思います

結果は本当です:匿名型を保存できます...

しかし、最初の部分:

tuple.Createでタイプを指定する必要がないため

常に真実とは限りません。次のシナリオを検討してください。

_interface IAnimal
{
}

class Dog : IAnimal
{
}
_

以下はコンパイルされません。

_Tuple<IAnimal> myWeirdTuple;

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

次のように、Createメソッドでtypeパラメーターを指定する必要があります。

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

new Tuple<IAnimal>(new Dog()) IMOを呼び出すのと同じくらい冗長です

8
taquion

個人的には、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);
    }

    ...

利点の1つは、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);

これにより、2つの匿名タイプのタプルが作成されます。1つ目はnew { string Name, DateTime BirthDate }で、2つ目はnew { int Height, string Name }です。

別のメソッドに渡すには、パラメーターの「タイプ」を定義できる必要があるため、それでできることはそれほど多くありません。本当に便利になります。

23
Grant

_Tuple.Create_の利点は、通常、型引数を省略できることです。 Tuple.Create(1,2)new Tuple<int,int>(1,2)よりも簡潔です。

コンストラクターから型引数を省略しようとするとnew Tuple(1,2)エラーCS0712が表示されます "静的クラス 'Tuple"のインスタンスを作成できません "

20
Jacob Lambert

違いはありません。ソースコードを見ると、同じことをしています。

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);
    }
4
d.moncada