タプルが何であるか、そしてそれを実際のシナリオでどのように使用するか説明してください。これがどのように私のコーディング経験を豊かにするのかを知りたいですか?タプルの使用法と時期
答えて
このmsdn articleは、例で非常によく説明しています。「タプルは、特定の数と要素のシーケンス」を持つデータ構造です。データの単一のセットを表すために
:
タプルは、一般的に4つの方法で使用されています。たとえば、タプルは がデータベースレコードを表し、そのコンポーネントはレコードの個々のフィールドを表すことができます。
データセットに簡単にアクセスして操作するため。
パラメータ (C#の場合)または
ByRef
のパラメータ(Visual Basicの場合)を使用せずにメソッドから複数の値を返す場合。複数の値を1つのパラメータでメソッドに渡す。 の例の場合、 は、 の起動時にスレッドが実行するメソッドに1つの値を指定できるという単一のパラメータを持つメソッドです(
Thread.Start(Object)
)。メソッド としてTuple<T1, T2, T3>
オブジェクトを指定すると、スレッドの起動ルーチンに3つの データ項目を指定できます。
タプルは、カスタムクラスを作成することなく、1つのオブジェクトに、おそらく、異なる種類の複数の値を結合することができます。これは、例えば3つの関連する値を返すが、新しいクラスを作成したくないメソッドを記述したい場合に便利です。
通常、クラスを作成する必要がありますが、これにより、各プロパティに便利な名前を付けることができます。プロパティがItem1
と呼ばれているので、広範囲にタプルを使用するコードは、すぐに、読めなくなるだろうItem2
、Item3
、など。
タプルクラスは、開発者が特定の使用のために特定のクラスを定義していないことにより、「迅速かつ怠惰」ことを可能にします。
プロパティ名は、Item1、Item2、Item3 ...です。これは、場合によっては意味を持たない場合もありますし、ドキュメント化されていない場合もあります。
タプルクラスは、強く型付けされたジェネリックパラメータを持っています。タプルクラスの依然としてユーザは、ジェネリックパラメータのタイプから推定することができる。
C#7では、このタプルの代わりに、クラス/オブジェクトを簡単に作成できるようになったはずです。 –
タプルとクラスの違いは、タプルにはプロパティ名がないことです。これはほとんど決して良いことではありません。抽象的な数式のように引数が無意味である場合にのみタプルを使用します。 5,6,7次元にわたる抽象計算は座標のタプルを取るかもしれない。
単純な配列を使用すると、この場合(おそらく値の型は同じです)十分ではありませんか? タプルを使用するといくつかの利点がありますか? –
型は同じように簡単に違うかもしれませんが、IComparable実装が同種の場合に利点となることがあると思います。あなたが言うように、私は単純なシナリオのために配列を使用する傾向があります。 – Kaido
非常に良い答え! –
これは、タプルタイプについて知るのに最も重要なことです。タプルはクラスであり、構造体ではありません。したがって、管理されたヒープに割り当てられます。割り当てられた各クラスインスタンスは、ガベージコレクションの負担を増やします。
注: プロパティItem1、Item2、さらにはセッターがありません。それらを割り当てることはできません。タプルは、いったんメモリに作成されると不変です。
_ "Burden" _ - ガベージコレクションの問題を見たことがありますか? – Gusdor
絶対に!ネットワーク通信処理コードについて考える。これは、たくさんのメモリを割り当て、割り当てを解除するので、GCが実行されている2分ごとに完了し、完了まで数秒かかる場合があります。下流の何かがそのデータにリアルタイムで依存している場合、これは受け入れられません。 別の例としては、携帯電話など、自動車道案内アプリなどのリアルタイムアプリを実行するリソースが制限された端末があります。 – stuckintheshuck
2つの値とそれぞれ異なるタイプの文字列、つまりintのために最大限使用します。それ以外の場合は、あなたが書くことができる最悪のコードになりつつあります。 – Ondra
使い方は限られていますが、おそらくクラス/モジュール内でしか使用しない方がよいでしょう。また、複雑な型( "Customer"、 "Employee"など)を含むタプルの使用法は、プリミティブより少し簡単です。 Tupleの多くを処理しようとするよりも悪いことはありません。 –