一部のSharePointサンプルが使用される理由
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
...
}
単純にではなく?
SPSite site = SPContext.Current.Web.Site;
...
更新
質問は次のように絞り込んだと思います。
SPContent.Current
を直接使用しないでください。コードがSharePoint内で実行されていることが確実でない限りです。しかし、それが真実ではないのはいつでしょうか。
Microsoftによる SharePoint 2010でのオブジェクトの破棄 に関するベストプラクティスドキュメントをご覧ください。ただし、 反対するビュー があります。
SharePointプロジェクトには、いくつか重要なポイントがあります。
using
)複数のSP ..オブジェクトで 一貫性の問題 が発生する可能性があります。
結局のところ、_SPSite site = SPContext.Current.Web.Site;
_は場合によっては問題ありませんが、このsite
オブジェクトを制御することはできません。これが問題である可能性があります。 new SPSite(...)
を使用する場合、SharePointが作成して管理するものではなく、常にyourSPSite
になります。
個人的には、ほとんどの場合using
構造を使用するため、すべてのオブジェクトは後で適切に破棄されます。あるいは、破棄せずに_SPContext.Current.Web
_を使用します。
コードが実行されるコンテキストによって異なります。たとえば、SPSite
ブロック内で実行している場合は、新しいRunWithElevatedPrivileges
インスタンスを作成する必要があります。
デニスGは正しいです。 SPSite/SPWeb/etcを破棄することは重要ですが、APIから直接提供されたオブジェクトを破棄しないでください。微妙ですが重要です。それ以外の場合、応答が生成されないか、スレッドの異常終了の状況が発生することはありません。私の経験では、ユーザーコンテキスト(コンテンツマネージャーの承認済みユーザーまたは匿名)が確実に利用できるSPSiteまたはSPWebプロパティの簡単な情報が必要な場合は、SPContext.Current。*オブジェクトを使用すると便利です。それ以外の場合は、RunWithElevatedPrivelegesメソッドを使用してコードをラップし、そのラムダ内に次のパターンを含めます。
SPSecurity.RunWithElevatedPrivileges(() =>
{
using (SPSite site = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
{
// stuff goes here elevated
}
}
});