2

私は非常に混乱しています。私は常に、C# にオブジェクトへのリンクが少なくとも 1 つある限り、オブジェクトは存在し続けると想定してきました。オブジェクトを完全に破棄する唯一の方法は、すべてのリンクを削除することです (それらをnullまたは別のものに設定することによって)。 、GC がそれを破棄するのを待ちます。

しかし、Unity3D を使った実験の結果、次のコードが示すように、この信念は不正確であると考えるようになりました。

GameObject objA = new GameObject();
Debug.Log("Is null: " + (objA == null));
GameObject.DestroyImmediate(objA);
Debug.Log("Now is null: " + (objA == null));

出力は次の 2 つのメッセージです。

Is null: False
Now is null: True

したがって、魔法のメソッドDestroyImmediateを呼び出すだけで、オブジェクトを取り除くことができ、さらに、リンクobjAは自動的にnull!にリセットされます。これはどのように世界であり得るのでしょうか?の中に何が入っているか想像できますDestroyImmediateか? これは通常の C# で行うことができますか、それとも Mono や Unity3D の汚いトリックですか?

更新:私に指摘されたように、実験は実際にオブジェクトが破壊されたことを証明していません。しかし、それは私の主な関心事ではありません。私の主な懸念は、リンクが何らかの形で無効になったことです。

4

2 に答える 2

2

リフレクターを使用して .NET アセンブリの内部を確認できます: http://www.red-gate.com/products/dotnet-development/reflector/およびそれらのコードを確認します。

于 2013-10-11T20:12:20.717 に答える
1

OK、Trevor のおかげで真実がすぐに明らかになりました。

objA実際には割り当てられませんnulltrue代わりに、オブジェクト自体が変更され、オーバーロードされた == 演算子がと比較して戻り始めますnull

于 2013-10-11T20:38:47.437 に答える