4

同僚の sharepoint 2010 コードをリファクタリングする必要があります。リストにアクセスする必要があるたびに、彼はこれを行います。

SPContext.Current.Web.Site.OpenWeb().Lists["List"];

私はこれをやっていた:

SPContext.Current.Web.Lists["List"];

これら2つの違いと、より効率的な方法は何ですか?

4

4 に答える 4

4

2 つ目は、はるかに効率的な方法です。

最初の方法では、高価な呼び出しである呼び出しを通じて新しいSPWebオブジェクトを作成しています。OpenWeb()使用が終了したら、このオブジェクトを手動で明示的に破棄する必要があることに注意してください。

ここを読む: http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

于 2012-01-09T09:46:31.603 に答える
1

パフォーマンスに代わるもう 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"];と、サイト コレクション内のリストが検索され、正常に実行されます。

于 2012-08-11T11:52:18.663 に答える
1

マドゥールに同意

メモリリークが発生しないため、2番目のアプローチを使用してください

ちなみに:SP2010にはSPListを取得する新しいメソッドがあります

SPContext.Current.Web.Lists.TryGetList("ListName");

それを使う

于 2012-01-10T06:37:44.440 に答える
0

マダールは高価なコードについて正しいです。私は彼がそれを明示的に処分することについて間違っていると最初に思ったが、彼はそれについても正しい。ベストプラクティスのドキュメントによると:

SPContextオブジェクトはSharePointフレームワークによって管理されるため、コードに明示的に配置しないでください。これは、SPContext.Site、SPContext.Current.Site、SPContext.Web、およびSPContext.Current.Webによって返されるSPSiteおよびSPWebオブジェクトにも当てはまります。

ただし、逆コンパイルされたアセンブリを見ると、新しいSPWebオブジェクトを返すSPContextオブジェクトでOpenWeb()メソッドを使用しています。したがって、明示的に廃棄する必要があります。

于 2013-01-22T00:22:02.420 に答える