[解決済み] いつ使うか。C# 7.0 のタプルとクラス
質問
タプルの前に、私はクラスとその変数を作成し、次にこのクラスからオブジェクトを作成し、そのオブジェクトをいくつかの関数の戻り値の型にするために使用しました。
今、タプルを使えば同じことができ、C# 7.0ではタプルのプロパティに理解しやすい名前を割り当てることができます(これ以前は
item1
,
item2
など...)
さて、ここで気になるのは、C# 7.0ではいつタプルを使い、いつクラスを作成すればいいのか、ということです。
どのように解決するのですか?
この回答が一部の人々の間で混乱を引き起こしているので、私は明確にする必要があります - 質問のように - ここで "tuple" へのすべての参照は、次のものを参照してください。
ValueTuple
型と C# 7 の新しいタプルの構文シュガー機能を指しており、決して古い
System.Tuple
の参照型を参照するものではありません。
今、私は、いつタプルを使うべきか、いつC# 7.0でクラスを作るべきか、考えています。
それは本当にあなたのコードに依存するので、あなただけが本当にその質問に答えることができます。
しかし、どちらかを選択する際の指針となるガイドラインやルールがあります。
タプルは値であるため、参照ではなく値でコピーされます。
ほとんどの場合、これは問題ではありません。しかし、大きな構造体のタプルを渡している場合、これはパフォーマンスに影響を与える可能性があります。しかし、Ref ローカル/リターンを使用して、これらのパフォーマンスの問題を回避することができます。
さらに、これらは値であるため、リモートでコピーを変更しても、元のコピーは変更されません。これは良いことですが、一部の人を巻き込む可能性があります。
タプル要素名は永続化されません。
要素に与えられた名前はコンパイラによって使用され、(ほとんどの場合)実行時には利用できません。これは、リフレクションがそれらの名前を発見するために使用できないことを意味します; それらは動的にアクセスすることができず、それらはレイザー・ビューで使用することができません。
また、これはAPIでの重要な考慮点です。メソッドから返されるタプルは、コンパイル後の名前の発見可能性に関するルールの例外です。コンパイラはタプル名に関する情報を保持する属性をメソッドに追加します。これは、あるアセンブリでパブリックメソッドからタプルを安全に返し、別のアセンブリでその名前にアクセスできることを意味します。
タプルは軽量です
タプルは型よりも冗長でなく、宣言が"inlined"(つまり、使用時に宣言する)ことができるため、書くのが非常に簡単です。これは、例えば、複数の値を返すメソッドを宣言するときにうまく機能します。
しかし、これらは使用時に宣言されるため、もしあなたが
MethodA
を呼び出す
MethodB
を呼び出す。
MethodC
を呼び出し、それぞれがタプルを返す場合、各段階でタプルを再定義する必要があります。そこには (
まだ
) タプルのエイリアスを作成し、複数のメソッドでそれを再利用する方法はありません。
常識的に考えて
タプルの使用を検討する可能性のあるあらゆる状況について、単純に自分自身に質問してください: "タプルはここのコードを単純化しますか"。その答えが「イエス」であれば、タプルを使用します。そして、それが最終的にタプルを使うかカスタムクラスを使うかについての主要な検討事項です。
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Pythonでリストをタプルに変換する
-
[解決済み】Tupleクラスで "Item1", "Item2 "よりも優れた命名法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] Tupleはいつ、何を使うのか?重複
-
[解決済み] そのタプルは、どのような要件を解決するために設計されたのでしょうか?