質問

SharePointオブジェクトを操作する際の使用ステートメントを使用したベストプラクティスは何ですか。使用されているオブジェクトが廃棄されるように、いつ、どのように使用する必要がありますか?

役に立ちましたか?

解決

重要なのは、コードがspsiteまたはspwebのインスタンスを作成する場合、それを処分する必要があることです。ただし、spcontext.currentからインスタンスを使用する場合は、それを処分しないでください。つまり、それが直接または間接的であるかどうかにかかわらず、あなたが作成したものを処分します。

独自のインスタンスを作成する例なので、使用する必要があります。

using(SPSite site = new SPSite("http://server"))
{
}

spcontextから既存のオブジェクトを使用する例は、使用する必要はありません。

SPWeb web = SPContext.Current.Web;
SPSite site = SPContext.Current.Site;

OpenWeb()を呼び出すことにより、SPWEBの独自のインスタンスを作成する例:

using(SPWeb web = SPContext.Current.Site.OpenWeb("http://server/mywebsite"))
{
}

また、最終的なブロックに廃棄するコールを配置することにより、例外がスローされていても、オブジェクトを処分するように注意してください。

try
{
   site = new SPSite("http://server");
   web = site.OpenWeb();
}
catch(Exception e)
{
   //handle it
}
finally
{
   if (web != null)
      web.Dispose();

   if (site != null)
      site.Dispose();
}

これらはほんの数例ですが、他にもたくさんあります。がここにあります 良い参照.

さらに、を利用できます spdisposecheck 道具。

他のヒント

マイクロソフトから、どのオブジェクト(SPSite、SPWEB)を処分するかについてのベストプラクティスガイドがあります。http://msdn.microsoft.com/en-us/library/ee557362(v=office.14).aspx

また、Microsoftが提供する廃棄チェッカーツールもあります。http://archive.msdn.microsoft.com/spdisposecheck

ゴールデンルールは次のようです:あなたがオブジェクトを所有している場合(つまり、 new オペレーター)、それを処分します。オブジェクトがSharePointオブジェクトモデル自体によって作成された別のオブジェクトから来る場合、そうではありません。 Laurieが示すように、Spdisposecheckを使用して確認してください。

上記の答えはすべて問題ありませんが、明確にするためにいくつかのものを追加したいだけです。

使用しているオブジェクトを処分する必要があるかどうかを確認するには、クラスのMSDN参照(カーソルがVSの宣言にあるときにF1を押す)を確認し、クラスが実装可能であるかどうかを確認できます。その場合は、実際にオブジェクトを作成した場合にのみオブジェクトを処分します(新しいステートメント、またはopenxxx()メソッドなど)。

使用しているステートメントを使用する場合、これらのオブジェクトには、トライカッチ式の構造は決して必要ありません。これは、ローリーの最終例に見られるように、使用されたステートメントがトライキャッチ式の構成に変換されるためです。使用されたステートメントは、はるかにエレガントで、コードをより読みやすくするため、目的が望ましいです。

spdisposecheckは素晴らしいツールのように思えますが、少し常識があれば、おそらく必要ないでしょう。

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