-1

私の質問は、C# でのオブジェクトの使用に関するものです。何が起こっているのか理解できたと思いますが、その理由を理解したいのです。ここでは説明しませんが、現在のデータ (現在の状態) を使用してオブジェクトの一時的なコピーを作成したいと考えています。そこで、新しいオブジェクトを作成し、それを元のオブジェクトに割り当て、元のオブジェクトを変更できると考えました。その時点で、2 つのオブジェクトが異なる状態になります。しかし、何が起こるかというと、コピーされたオブジェクトは最初のオブジェクトとまったく同じように見えてしまいます。説明するコードを次に示します。

Order o1 = new Order();
o1.property1 = "test 1";

Order o2 = new Order();
o2 = o1;

o1.property1 = "test 2";

しかし、このコードの最後では、o1 と o2 の両方で、property1 が「test 2」に設定されています。すべてのオブジェクトは単なるポインターであることを認識していると思います。そのため、1 つを変更すると別のオブジェクトも変更されますが、これがなぜなのか、なぜ便利なのか理解できません。ここで欠けている基本的なものはありますか?また、私がやりたいことを達成するための最良の方法は何ですか? つまり、オブジェクトの状態を保存し、変更を加えてから、必要に応じて元に戻します。うまくいけば、これは理にかなっています。

4

7 に答える 7

7

C# のオブジェクト変数は、メモリ内の特定のオブジェクトへの参照(ポインターではない) です。宣言すると

Order o2 = new Order();

ヒープに新しい Order オブジェクトを作成し、そのオブジェクトへの参照を o2 変数に割り当てます。あなたが次に述べるとき

o2 = o1;

o2 を o1 への参照にするようにコンパイラーに指示しています。この時点で、元の o2 オブジェクトへの参照は失われ、そのオブジェクトのメモリは次のガベージ コレクション スイープ中に削除されます。

これ以降、o1 と o2 の両方がメモリ内の同じオブジェクトを参照します。あるオブジェクトから別のオブジェクトに情報をコピーするには、新しい宛先オブジェクトをインスタンス化し、あるオブジェクトから別のオブジェクトにすべてのデータをコピーする手順を実装する必要があります。詳細については、ICloneable の MSDN ドキュメントを参照してください。

于 2013-03-05T23:02:04.053 に答える
2

ご質問について

私がやりたいことを達成するための最良の方法は何ですか?つまり、オブジェクトの状態を保存し、変更を加えてから、必要に応じて元に戻します

簡単な方法は、オブジェクトを単純にシリアル化することです。たとえば、XMLSerializer. その後、変更を破棄する場合は、元のオブジェクトを逆シリアル化し、変更されたオブジェクトを元のバージョンに置き換えます。

于 2013-03-05T23:07:45.320 に答える
2

構造体を使用してタスクを達成します。クラスは参照型で、構造体は値型です。クラスはメモリ ヒープに格納されます。構造体はスタックに格納されます。詳細については、構造体とクラスを検索し、違いを学びます

于 2013-03-05T23:23:15.127 に答える
1

Java には、オブジェクト参照以外の非プリミティブ データ型の概念はありません。オブジェクト参照で実行できるほとんどのことは、それによって参照されるオブジェクト.(Java の演算子) に作用することを伴うためです。.net には非プリミティブな値の型がありますが、ほとんどの .net 言語は、同じ演算子を使用するという規則 (->ポイント先オブジェクト.のメンバーへのアクセスや構造体のメンバーへのアクセスに使用する C および C++ とは異なります) を維持しています。 .「逆参照およびアクセスメンバー」と「アクセス値型メンバー」の両方に使用されます。

個人的には、Java の「すべてがオブジェクト参照である」という設計が嫌いです。値型と参照型が同じ.演算子を使用して非常に異なることを意味するという .net の決定は役に立ちませんが、それが何であるかです。

于 2013-03-05T23:03:59.787 に答える