[解決済み] 構造体とクラス
質問
コードで10万個のオブジェクトを作成しようとしています。それらは小さいもので、2つか3つのプロパティしか持っていません。私はそれらを一般的なリストに入れ、それらがあるとき、私はそれらをループし、値をチェックします。
a
をチェックし、おそらく値を更新します。
b
.
これらのオブジェクトは、クラスとして作成する方が速いですか、それとも構造体として作成する方が良いですか?
EDIT
a. プロパティは値型(文字列は除く?)です。
b. バリデートメソッドを持つかもしれない(まだ確定していない)。
編集2
ヒープ上のオブジェクトとスタック上のオブジェクトは、ガベージコレクタによって等しく処理されるのでしょうか、それとも異なる動作をするのでしょうか?
どのように解決するのですか?
<ブロッククオートそれは より速く として作成する方が速いですか?
その質問の答えを決定できるのはあなただけです。両方の方法を試してみてください。 測る を測定してください。そうすれば、その変更が関連するシナリオの実際のユーザーに意味のある影響を与えるかどうかがわかります。
構造体はより少ないヒープ メモリを消費します (なぜなら構造体は より小さい であり、コンパクト化しやすいからであって、スタック上にあるからではありません)。しかし、参照コピーよりもコピーに時間がかかります。メモリ使用量や速度に関するパフォーマンス指標がどのようなものか知りませんが、ここにはトレードオフがあり、それが何であるかを知っているのはあなた自身なのです。
それは より良い として作成するのが良いのでしょうか?
クラスか、構造体か。経験則から言うと
もしオブジェクトが:
1. 小さい
2. 論理的に不変の値
3. たくさんある
それなら、構造体にすることを考えます。そうでなければ、参照型にこだわりますね。
構造体のフィールドを変更する必要がある場合は、フィールドが正しく設定された新しい構造体全体を返すコンストラクタを構築する方がよいでしょう。その方が若干遅いかもしれませんが(測定してください!)、論理的にははるかに簡単です。
ヒープとスタック上のオブジェクトはガベージコレクタによって同じように処理されるのでしょうか?
いいえ。 ので、同じではありません。 スタック上のオブジェクトはコレクションのルートだからです。 . ガベージコレクタは、「スタック上のこのオブジェクトは生きているか」と尋ねる必要がありません。 その答えは常に「はい、スタック上にあります」だからです。 保つ というのは、スタックは実装の詳細だからです。 ジッターは、たとえば、通常はスタック値であるものを登録する最適化を導入することが許されており、その後、それは決してスタック上にないので、GC はそれがまだ生きていることを知りません。登録されたオブジェクトは、それを保持しているレジスタが再び読み込まれることがないと同時に、その子孫を積極的に収集させることができます)。
しかし、ガベージコレクタは は は、生きていることが知られているオブジェクトを生きているものとして扱うのと同じように、スタック上のオブジェクトを生きているものとして扱わなければなりません。スタック上のオブジェクトは、生きている必要があるヒープに割り当てられたオブジェクトを参照できるので、GC は生きているセットを決定する目的のために、スタックオブジェクトを生きているヒープに割り当てられたオブジェクトのように扱わなければなりません。 しかし、明らかにそれらは ではありません。 なぜなら、それらはそもそもヒープ上に存在しないからです。
これは明確ですか?
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
-
[解決済み] ミュータブル構造体はなぜ "悪 "なのか?
-
[解決済み] .NETでは、'for'と'foreach'のどちらのループが速く実行されますか?
-
[解決済み】オブジェクトを破棄してnullにする必要があるのか?
最新
-
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#
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] ミュータブル構造体はなぜ "悪 "なのか?
-
[解決済み】クラスではなく、構造体を使用する必要があるのはどんな場合ですか?