C#では、myclassというクラスがあります。
私はこのようなオブジェクトを作成しています、
myclass myx = new myclass();
それから
myx = new myclass();
エラーは発生していませんが、これが何を意味するのか.....
これは、さらに別のインスタンスを作成して変数に割り当て、newで作成した最初のインスタンスを効果的に「放棄」することを意味します。
ガベージコレクターは、ある時点で古いものをクリーンアップすることを知っています。別の変数に保存しなかったため、アクセスできなくなりました。
これは、最初のmyclassインスタンスを破棄し、新しいインスタンスを作成していることを意味します。リストに追加するなど、最初のコードで何かを実行している他のコードが間にある可能性があります。
myclass myx = new myclass();
この行には、宣言と初期化の両方があります
しかし
myx = new myclass();
これには、以前に宣言されたオブジェクトの初期化のみがあります
myclass myx = new myclass();
エラーが必要な場合は、コードから削除してください。そうすれば、間違いなくエラーが発生します。つまりnew
、キーワードはオブジェクトの初期化に使用されますが、そのオブジェクトを最初に宣言する必要があります。これは、同じ行で実行することも、オブジェクトの宣言後に別の場所で実行することもできます。
Gohereの詳細についてはnew
myx
のインスタンス(オブジェクト)への参照myclass
です。
で作成されたオブジェクトを指すようmyclass myx = new myclass();
に参照を指示します。myx
new myclass()
参照は再利用可能であるため、を書くmyx = new myclass();
と、その参照(myx
)はの古いインスタンスを指すのをやめ、myclass
作成したばかりの新しいインスタンスを指すようになります。
他の誰も古いものを指さないので、ガベージコレクターがアクティブになり(すぐにではありませんが、それについて心配する必要はありません)myclass
、ヒープから古いオブジェクトを削除します。
ご存知かもしれませんが、.Net言語には2つの異なるタイプのオブジェクトがあります。参照型と値型(クラスと構造体).Netはそれぞれの型を異なる方法で管理します。変数に参照型を設定すると、その名前はそのオブジェクトのメモリアドレスは変数に保持されますが、値型オブジェクト(int、long、...などの構造体)を変数に設定すると、実際には変数に値が保持されます。したがって、このシナリオでは:
var a=new MyClass();
var b=a;
MyClassがクラスの場合、aとbの両方がメモリ上の同じオブジェクトを参照しています。そうでない場合、両方の値が異なるため、次のように実行すると次のようになります。
a.Value=5;
a.Value == b.Valueは、MyClassが参照型の場合はtrueになり、値型オブジェクトの場合はfalseになります。ここで、変数myxをMyClassの新しい参照に設定している場合( class)またはMyClassの新しい値を設定しています(構造体の場合)このようなことを行うと、もう誰も必要としないもの(myxの古い設定)があり、次回のGCでガベージコレクションが行われます。メモリをクリーンアップしようとします。