私はこのトピックについて数日間議論してきました。いくつかのブログをチェックし、SPDisposeChecker.exe でいくつかのテストも行いました。Dispose() をいつ呼び出す必要があるかについては、さまざまなアイデアがあるようです。たとえば、Christian Glessner によるこのブログ:
http://www.ilovesharepoint.com/2010/03/sharepoint-disposing-myths.html
SPWeb で常に Web を Dispose する必要はないと述べています。
ただし、Microsoft のベスト プラクティスでは、Openweb を破棄することをお勧めしています。http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx
次のコード ブロック (少し古く、Using ブロック内にはありません)::
try
{
SPSite site = new SPSite("http://mysite.aspx");
web = site.OpenWeb();
site.Dispose();
site = null;
}
catch (System.IO.FileNotFoundException x)
{
return;
}
SPDisposeCheck で簡単なチェックを行うと、エラーが発生します。
web = site.OpenWeb(); の行の「使い捨てタイプは破棄しません」。
しかし、次のように最終ブロックを配置すると:
finally
{
if (web != null)
web.Dispose();
}
SPDisposeCheck は、次のエラーを返します:「メモ: Dispose は、このオブジェクトに対して呼び出されるべきではありません」
少し調べてみると、このブログで説明されているように、SPDispose にバグがあることがわかりました。
そのため、私は自分の研究に満足していませんでした。もちろん、Microsoft のベスト プラクティスに従うことは良いことであり、常に Dispose() を推奨しています。しかし、処分する時期と処分しない時期については、まだ十分に満足していません。
また、「SPSite を破棄すると、「m_openedWebs」内のすべての SPWeb をループし、それぞれで Close メソッドを呼び出します」という文は正しいですか?
私のコード ブロックに戻ると、SPWeb.Dispose (finally ブロック上) が本当に必要なのでしょうか?