2009年6月8日15:52更新:短い回答NO。元の質問:
廃棄に関するSPWeb.Siteのガイダンスを提供するリファレンスが見つかりません。SharePointオブジェクトの破棄に関するより一般的なベストプラクティスのドキュメントをいくつか確認しました。
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
残念ながら、これらのガイドラインのいずれもSPWeb.Siteについて言及していません。コンテキストを与えるために、メソッドの引数としてSPWebを受け入れるパブリック拡張APIを作成しています。
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
SPWebのrefelectorでClose()メソッドを調べましたが、これはSPWeb.Dispose()によって呼び出され、実際のSPSiteメンバーフィールドが破棄されることを示すものは何もありません。
更新:2009年6月8日13:47
アレックスの提案で
「100回実行されるループに入れ、WSSv3およびMOSS2007でのSPSite/ SPWebリークのトラブルシューティングで説明されているSPRequestStackTraceレジストリキーを使用して、テストコードが問題の原因であることを確認します。」
Webパーツ内に含まれている次のコードを実行しました。
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
SharePointログには何も表示されませんでした。
この素朴な実験から実際の結論を出すことを躊躇しますが、SPWeb.Siteを破棄する必要はないことを示唆しています。このテーマについてもっと情報を持っている人から具体的な答えを得るのは本当に素晴らしいことです。
更新:2009年6月8日14:52 グレッグのコメントによるプロンプトm_Siteの割り当てを作成しましたが、最終的には常に内部コンストラクターを介してSPWebに渡されるようです。たとえば、SPWeb.OpenWebはこれを新しいSPWeb()に渡します。したがって、SPWeb.Siteは破棄されるべきではないと確信しています。破棄された場合、実際に問題が発生する可能性があります。