質問

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:パラメーターは値によって渡されますが、参照型の場合、参照は値です。したがって、関数の参照を破棄しても、元の参照型は影響を受けません。参照変数に変更を加えた場合、つまりデータセット内のデータを変更した場合、元の参照タイプは関数の外部で更新されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top