質問
1つのクラスで生成されたオブジェクトがあります
public class CreatingClass
{
public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
{
....
}
public void DestroyObject(IMyInterface objectToDestroy)
{
....
}
}
この関数をクライアント クラスから呼び出した後、作成クラスによってアプリケーションを通じてこの関数を無効にする必要がある場合があります。
次のようなことはできますか
public class ClientClass
{
MyObject obj;
CreatingClass creatingClass = new CreatingClass();
private void AFunctionToCreateMyClass()
{
obj = creatingClass.CreateObject<MyClass>(parameters);
}
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(obj);
Assert.IsNull(obj);//Doesn't fail
}
}
objectToDestroy = null を試してみましたが、うまくいくとは思いませんでした(そしてうまくいきませんでした)
解決
オブジェクトを実際に破棄することはできません。ガベージコレクションのルールが適用されます。プッシュで、 IDisposable
を確認し、Dispose()、
提供されている ref
サンプルを使用できますが、多くのポイントがあるかどうかはわかりません。 &quot; obj = null;&quot;でフィールドをクリアする方が簡単です。
ref
の使用は混乱を招く可能性があります。これは変数で機能するためです。つまり、次の場合:
var tmp = obj;
DestroyObject(ref tmp);
then obj
は元の値のままです。正当な理由がない限り、 ref
アプローチはお勧めしません。
他のヒント
欲しいのは
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
これにより、ローカル参照がnullに設定されます
C#のすべてのパラメーターは値で渡されるため、参照自体を変更する場合は、 ref
キーワードを使用して渡す必要があります。
IDisposableパターンをお探しですか?
[「CreatingClass」は通常ファクトリーと呼ばれます]
なぜオブジェクトを無効にすることにこだわるのかわかりません。それに対するすべての「ルート」参照が削除された後にのみガベージ コレクションが行われます。しかし、次のように変更すると、
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
そして次のように呼び出します:
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(ref obj);
Assert.IsNull(obj);
}
提供された回答について少し説明します...
C#のパラメーターは、型、値型の値、参照型の参照によって渡されます。ただし、クラス(参照型)または構造体(値型)に関連する可能性があるインターフェイスを渡すため、ref変数として明示的に宣言する必要があります。
ただし、実際に従う必要があるのは(前述のとおり)この機能のために設計されたIDisposableパターンです。
EDIT:パラメーターは値によって渡されますが、参照型の場合、参照は値です。したがって、関数の参照を破棄しても、元の参照型は影響を受けません。参照変数に変更を加えた場合、つまりデータセット内のデータを変更した場合、元の参照タイプは関数の外部で更新されます。