1. ホーム
  2. c#

[解決済み] いつ使うか。C# 7.0 のタプルとクラス

2023-04-04 20:38:09

質問

タプルの前に、私はクラスとその変数を作成し、次にこのクラスからオブジェクトを作成し、そのオブジェクトをいくつかの関数の戻り値の型にするために使用しました。

今、タプルを使えば同じことができ、C# 7.0ではタプルのプロパティに理解しやすい名前を割り当てることができます(これ以前は item1 , item2 など...)

さて、ここで気になるのは、C# 7.0ではいつタプルを使い、いつクラスを作成すればいいのか、ということです。

どのように解決するのですか?

この回答が一部の人々の間で混乱を引き起こしているので、私は明確にする必要があります - 質問のように - ここで "tuple" へのすべての参照は、次のものを参照してください。 ValueTuple 型と C# 7 の新しいタプルの構文シュガー機能を指しており、決して古い System.Tuple の参照型を参照するものではありません。

今、私は、いつタプルを使うべきか、いつC# 7.0でクラスを作るべきか、考えています。

それは本当にあなたのコードに依存するので、あなただけが本当にその質問に答えることができます。

しかし、どちらかを選択する際の指針となるガイドラインやルールがあります。

タプルは値であるため、参照ではなく値でコピーされます。

ほとんどの場合、これは問題ではありません。しかし、大きな構造体のタプルを渡している場合、これはパフォーマンスに影響を与える可能性があります。しかし、Ref ローカル/リターンを使用して、これらのパフォーマンスの問題を回避することができます。

さらに、これらは値であるため、リモートでコピーを変更しても、元のコピーは変更されません。これは良いことですが、一部の人を巻き込む可能性があります。

タプル要素名は永続化されません。

要素に与えられた名前はコンパイラによって使用され、(ほとんどの場合)実行時には利用できません。これは、リフレクションがそれらの名前を発見するために使用できないことを意味します; それらは動的にアクセスすることができず、それらはレイザー・ビューで使用することができません。

また、これはAPIでの重要な考慮点です。メソッドから返されるタプルは、コンパイル後の名前の発見可能性に関するルールの例外です。コンパイラはタプル名に関する情報を保持する属性をメソッドに追加します。これは、あるアセンブリでパブリックメソッドからタプルを安全に返し、別のアセンブリでその名前にアクセスできることを意味します。

タプルは軽量です

タプルは型よりも冗長でなく、宣言が"inlined"(つまり、使用時に宣言する)ことができるため、書くのが非常に簡単です。これは、例えば、複数の値を返すメソッドを宣言するときにうまく機能します。

しかし、これらは使用時に宣言されるため、もしあなたが MethodA を呼び出す MethodB を呼び出す。 MethodC を呼び出し、それぞれがタプルを返す場合、各段階でタプルを再定義する必要があります。そこには ( まだ ) タプルのエイリアスを作成し、複数のメソッドでそれを再利用する方法はありません。

常識的に考えて

タプルの使用を検討する可能性のあるあらゆる状況について、単純に自分自身に質問してください: "タプルはここのコードを単純化しますか"。その答えが「イエス」であれば、タプルを使用します。そして、それが最終的にタプルを使うかカスタムクラスを使うかについての主要な検討事項です。