SPSite site = new SPSite(SPContext.Current.Web.Url) vs SPContext.Current.Web.Site

Jan Aagaard picture Jan Aagaard · Nov 8, 2011 · Viewed 52k times · Source

Why do some SharePoint examples use

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
    ...
}

and not just simply?

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

Update

I think I have narrowed the question down to the following:

It seems that I should not use SPContent.Current directly, unless I am certain, that my code runs inside SharePoint. But when would that not be true?

Answer

Dennis G picture Dennis G · Nov 8, 2011

Take a look at the best practices documentation on disposing objects in SharePoint 2010 from Microsoft, however there are opposing views.

There are a few key takeaways for SharePoint projects:

  • Always dispose your SPWeb / SPSite objects --> memory leaks
  • Make use of SPContext.Current... when you are sure your code is running in a SharePoint context
    • Unit Tests mean no Sharepoint context
    • External utilities mean no Sharepoint context
    • Powershell means no SharePoint context (e.g. activating a feature with feature receiver might fail)
  • Do not dispose SPContext.Current... but create your own object (again using)

You might have problems with consistency with your multiple SP.. objects.

In the end SPSite site = SPContext.Current.Web.Site; is fine in some instances, but you do not have control over this site object - that might be the problem. If you go for new SPSite(...) you will always have your SPSite and not something SharePoint created and managed for you.

Personally I almost always go for the using structure so all objects are disposed properly afterwards. Alternatively I use SPContext.Current.Web without disposing.