タプルとリストの異なる属性。
- タプルは異種であり、リストは同種です。
- タプルは不変ですが、リストは変更可能です。
多くの場合、あるタイプの使用が他のタイプよりも優先されます。ただし、他のシナリオでは、どちらのデータ型も等しく適切である可能性があります。そのため、タプルとリストのメモリおよび/またはパフォーマンスへの影響は、私たちの決定を導く可能性がありますか?
ありがとう、
さて、あなたが言及したことに加えて、タプルには最大8つのアイテムしか含めることができないというかなり大きな違いがあります。(わかりました、技術的には、最後のタプル引数の型を別のタプルにすることで、任意に大きなタプルを作成できますが、実際にそれを行うには少し気が狂わなければならないと感じずにはいられません。)
Python などの言語のタプルとは異なり、C# のタプルは汎用のデータ構造として実際に使用することはできません。C# でのタプルの最も一般的な使用例の 1 つは、関数から複数の値を返す場合、または何らかの理由で 1 つしか取ることができない関数に複数の値を渡す場合 (たとえば、e.Argument
aに渡す場合BackgroundWorker
)、または他の可能性のある状況です。カスタム クラスを作成する必要はありません。また、匿名型を使用することもできません。
コンパイル時に含まれるアイテムの数 (およびアイテムの種類) を正確に知る必要があるため、タプルの使用は実際には非常に限られています。一方、リストは同種のデータを汎用的に保存するためのものであり、アイテムがいくつあるかは必ずしもわかりません。あなたが言ったように、「どちらのデータ型も等しく適切である可能性がある」コードの例を見てみたいです。
さらに、タプルとリストはまったく異なる問題を解決するため、メモリ/パフォーマンスの影響を比較することはおそらくかなり限定的なものです。ただし、タプルは構造体ではなくクラスとして実装されるため、値型とは異なり、リストと同じようにヒープに格納され、関数間で渡すときにコピーされません。ただし、これらはIStructuralEquatable
andIStructuralComparable
インターフェイスを実装しており、Equals
メソッドは this が true を返すように実装されています: new Tuple<int>(1).Equals(new Tuple<int>(1))
(一方、new List<int>() { 1 }.Equals(new List<int>() { 1 })
is は false)。