変数が現在のスコープに対してローカルである場合、変数が終了する直前にそれらをnullに設定する理由はありますか?
{
var com = new AComponentObjectModelInterface();
// something goes here
// ...
com = null; // why?
}
変数が現在のスコープに対してローカルである場合、変数が終了する直前にそれらをnullに設定する理由はありますか?
{
var com = new AComponentObjectModelInterface();
// something goes here
// ...
com = null; // why?
}
短い答え、いいえ、C#ではありません
これは多くの場合、開発者がVB6などの他の言語を使用する習慣です。
変数をnullに設定しても、それが参照するオブジェクトは破棄されません。実際、変数のスコープを拡張することにより、ガベージコレクションを妨げる可能性があります。
たぶん、これを使用した開発者は、VB6コードを手動で移行していました。しかし、彼はそれを無視しました
Set aComponentObjectModelInstance = new AComponentObjectModelInterface
// something goes here
// ...
Set aComponentObjectModelInstance = Nothing
に翻訳する必要があります
var aComponentObjectModelInstance = new AComponentObjectModelInterface();
try
{
// something goes here
// ...
}
finally
{
Marshal.ReleaseComObject(aComponentObjectModelInstance);
}
代わりは
簡単な答え:あなたの特定のケースでは、理由は何もありません。ほとんどの場合、それらのプログラマーは、それが理にかなっている別の言語から来ました。
Dispose
同じオブジェクトが複数存在しないようにすると便利な場合があります。Close
クラスをクリーンアップするメソッドがあるとします。オブジェクトをに設定することにより、複数の呼び出しが複数回試行されないようnull
にすることができます。Close
Dispose
DisposableMember
public void Close()
{
if (DisposableMember != null)
{
DisposableMember.Dispose();
DisposableMember = null;
}
}
ただし、それ自体は何も解放/破棄しないことに注意してください。