同僚の sharepoint 2010 コードをリファクタリングする必要があります。リストにアクセスする必要があるたびに、彼はこれを行います。
SPContext.Current.Web.Site.OpenWeb().Lists["List"];
私はこれをやっていた:
SPContext.Current.Web.Lists["List"];
これら2つの違いと、より効率的な方法は何ですか?
同僚の sharepoint 2010 コードをリファクタリングする必要があります。リストにアクセスする必要があるたびに、彼はこれを行います。
SPContext.Current.Web.Site.OpenWeb().Lists["List"];
私はこれをやっていた:
SPContext.Current.Web.Lists["List"];
これら2つの違いと、より効率的な方法は何ですか?
2 つ目は、はるかに効率的な方法です。
最初の方法では、高価な呼び出しである呼び出しを通じて新しいSPWeb
オブジェクトを作成しています。OpenWeb()
使用が終了したら、このオブジェクトを手動で明示的に破棄する必要があることに注意してください。
ここを読む: http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx
パフォーマンスに代わるもう 1 つのポイントは、ステートメントSPContext.Current.Web.Site.OpenWeb().Lists["List"]
が現在のサイトList
コレクションからリストにアクセスするのに対し、ラインは現在の Webからリストにアクセスしますが、現在のサイト コレクションからはアクセスしないことです。SPContext.Current.Web.Lists["List"];
このシナリオを考えてみましょう...
Employee
サイト コレクションにリストが存在するとしますhttp://[web-app]/sites/sa
。
また、sa サイト コレクションにはサブサイト en-us があります。
次に、この行を使用SPContext.Current.Web.Lists["List"];
すると、sa/en-us 内の Web でリストを見つけようとし、エラーがスローされます。
ステートメントを使用するSPContext.Current.Web.Site.OpenWeb().Lists["List"];
と、サイト コレクション内のリストが検索され、正常に実行されます。
マドゥールに同意
メモリリークが発生しないため、2番目のアプローチを使用してください
ちなみに:SP2010にはSPListを取得する新しいメソッドがあります
SPContext.Current.Web.Lists.TryGetList("ListName");
それを使う
マダールは高価なコードについて正しいです。私は彼がそれを明示的に処分することについて間違っていると最初に思ったが、彼はそれについても正しい。ベストプラクティスのドキュメントによると:
SPContextオブジェクトはSharePointフレームワークによって管理されるため、コードに明示的に配置しないでください。これは、SPContext.Site、SPContext.Current.Site、SPContext.Web、およびSPContext.Current.Webによって返されるSPSiteおよびSPWebオブジェクトにも当てはまります。
ただし、逆コンパイルされたアセンブリを見ると、新しいSPWebオブジェクトを返すSPContextオブジェクトでOpenWeb()メソッドを使用しています。したがって、明示的に廃棄する必要があります。