3

私は長い間この情報を探していました。このようなことを尋ねる人を見たことがありません。アンセーフ コード内で C# のポインターを使用できることはわかっていますが、そうではありません。問題は:

MyClass beta = new MyClass();
MyClass alpha = beta;
beta = null;

私が今しなければならないことは、ベータをヌルに設定し、アルファをヌルに設定することです。関数でアルファを返したので、もうアクセスできないとしましょう。どうすればnullに設定できますか? C++ で beta と alpha がポインターの場合、beta が指すメモリを解放できますが、c# でそれを行う方法がわかりません。

より基本的な方法では、両方の変数を null に設定する必要がありますが、アクセスできるのはそのうちの 1 つだけです。


編集

私が行った質問とは関係のない回答がいくつか見られました...もう一度説明します。モーションエフェクトを実行し、このモーションを一時停止または停止するために使用できるインスタンスを返すクラスを作成しています。このクラスを使用するプログラマーは、使用する if(variable != null) 前に変数をテストするのに慣れています。私が必要とするのは、モーションが null に変わったインスタンスの上にあるときです。

それを行う方法はありますか?

4

4 に答える 4

10

間接的なレイヤーを追加する必要があります。C++ の用語で言えば、MyClassはオブジェクトへのポインターです。そのため、両方のポインターを null に設定するには、代わりにポインターへのポインターを渡す必要があります。これにより、ポインターへのポインターを単なるポインターに解決し、それを null に設定できます。 、および両方の二重ポインタは に解決されnullます。

C# で間接的なレイヤーを追加することは、通常、新しいクラスを作成することを意味します。

public class Wrapper<T>
{
    public T Value { get; set; }
}

それを使用して、alphabetaそれぞれをWrapper<MyClass>オブジェクトにすることができます (それらが両方とも の同じインスタンスであることを確認してくださいWrapper) 。ValueWrappernull

于 2013-01-16T20:41:39.977 に答える
0

クラスに使い捨てオブジェクトが含まれていない限り、オブジェクトを破棄する必要はありません。それを null に設定すると、単にオブジェクトが null になり、メモリが解放されませんが、後でオブジェクトを確認する必要がある場合に役立ちます...

メモリ使用量をクリーンアップする必要があるため、クラスを使い捨てとしてマークする必要がある場合は、クラスをIDisposableから継承することを検討してください。インターフェース。

于 2013-01-16T20:44:11.870 に答える
0

ある種の AV/例外を取得する必要がある場合 (削除されたオブジェクトにアクセスする C++ の動作に一致させるため)、取得できる最も近い方法は、オブジェクトを IDisposable にし、オブジェクトが破棄された後にすべてのメソッド/プロパティをスローすることです (Stream 派生オブジェクトの方法と同様)振る舞う)。

MyClass beta = new MyClass();
MyClass alpha = beta;
beta.Dispose();

alpha.Method(); // should throw  ObjectDisposedException.
于 2013-01-16T20:44:23.373 に答える
0

どちらもする必要はありません。C# メモリは自動的に管理されるため、参照がなくなると解放されます。OutOfMemoryException をキャッチしたために具体的に何かを解放したい場合は、@JanesAbouChleih が指摘するように、ものを null に設定してガベージ コレクターを強制することができます。メソッドを呼び出して、必要.Disposeなその他のクリーンアップ コードMyClass(ファイルのクローズ、バッファーのフラッシュなど) を実装することをお勧めします。

参考文献:

http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

http://msdn.microsoft.com/en-us/library/ms973837.aspx

また、物を処分する方法/時期/理由に関する同様の質問: Do you need to dispose of objects and set them to null?

于 2013-01-16T20:46:20.593 に答える