Best Coding Practices in SharePoint – Part1

Best Coding Practices in SharePoint – Part1
13 votes, 4.54 avg. rating (90% score)

Introduction

This post covers some of the best coding practices that should be followed in SharePoint development. We will also see of the bad practices and why we should avoid them.
It is highly essential that everyone involved with SharePoint should know about these best practices. I am providing in various series due to high importance it had. There are couple of authors from Microsoft like Scott Harris,Mike Ammerlaan, Roger Lamb, Stefan Gobner who has provided their valuable inputs and I am keeping their inputs also in this article.

Skill Level – High


Best Coding Practice #1

using(SPSite oSPsite = new SPSite("http://server"))
{
  using(SPWeb oSPWeb = oSPSite.OpenWeb())
   {
       str = oSPWeb.Title;
       str = oSPWeb.Url;
   }
}  

 

Comments:
Take advantage of ‘using’ clause, because SPWeb and SPSite objects implement the IDisposable interface, and standard .NET Framework garbage collection calls the Dispose method to free any resources associated with the object from memory.

DO Not #1

using( SPWeb web = SPControl.GetContextWeb(HttpContext.Current)) { ... }
 

Comments:
SPContext objects are managed by the SharePoint framework and should not be explicitly disposed in your code. This is true also for the SPSite and SPWeb objects returned by SPContext.Site, SPContext.Current.Site, SPContext.Web, and SPContext.Current.Web

DO Not #2


    using (SPWeb web = new SPSite(SPContext.Current.Web.Url).OpenWeb())
    {
        // ... New SPSite will be leaked.
    } // SPWeb object web.Dispose() automatically called.


Comments:
SPSite object is instantiated but not disposed, because the runtime ensures disposal of only the SPWeb object returned by OpenWeb.
You can fix this problem by nesting one using statement within another as in Best Coding Practice #1

Best Coding Practice #2

 using (SPSite siteCollectionOuter = new SPSite("http://moss"))
    {
        SPSite siteCollectionInner = null;
        try
        {
            SPWebApplication webApp = siteCollectionOuter.WebApplication;
            SPSiteCollection siteCollections = webApp.Sites;

            siteCollectionInner = siteCollections[0];
        }
        finally
        {
            if (siteCollectionInner != null)
                siteCollectionInner.Dispose();
        }
    } // SPSite object siteCollectionOuter.Dispose() automatically called.
 

Comments:
The SPSiteCollection [] index operator returns a new SPSite object for each access. An SPSite instance is created even if that object was already accessed.

DO Not #3

using (SPSite siteCollectionOuter = new SPSite("http://moss"))
    {
        SPWebApplication webApp = siteCollectionOuter.WebApplication;
        SPSiteCollection siteCollections = webApp.Sites;

        SPSite siteCollectionInner = siteCollections[0];
        // SPSite siteCollectionInner leak. 
    } // SPSite object siteCollectionOuter.Dispose() automatically called.

Comments:
Code samples demonstrate improper disposal of the SPSite object. You can fix this problem by as in Best Coding Practice #2

Best Coding Practice #3

  using (SPSite siteCollectionOuter = new SPSite("http://moss"))
    {
        SPWebApplication webApp = siteCollectionOuter.WebApplication;
        SPSiteCollection siteCollections = webApp.Sites;

        foreach (SPSite siteCollectionInner in siteCollections)
        {
            try
            {
                // ...
            }
            finally
            {
                if(siteCollectionInner != null)
                    siteCollectionInner.Dispose();
            }
        }
    } // SPSite object siteCollectionOuter.Dispose() automatically called.
 

Comments:
If SPSiteCollection [] is used with foreach use proper way to dispose.

DO Not #4

 using (SPSite siteCollection = new SPSite("http://moss"))
    {
        SPWeb web = siteCollection.AllWebs.Add("site-relative URL");
        // SPWeb object leaked.
    }  

Comments:
AllWebs property collection require the SPWeb object to be closed after access. You can fix this problem by as in Best Coding Practice #4

Best Coding Practice #4

  using (SPSite siteCollection = new SPSite("http://moss"))
    {
        using (SPWeb web = siteCollection.AllWebs.Add("site-relative URL"))
        {
        } // SPWeb object web.Dispose() automatically called.
    }  
 

Comments:
SPWeb object from AllWebs property collection is disposed


Best Coding Practice #5

 using (SPSite siteCollection = new SPSite("http://moss"))
    {
        using (SPWeb outerWeb = siteCollection.OpenWeb())
        {
            foreach (SPWeb innerWeb in siteCollection.AllWebs)
            {
                try
                {
                    // ...
                }
                finally
                {
                    if(innerWeb != null)
                        innerWeb.Dispose();
                }
            }
        } // SPWeb object outerWeb.Dispose() automatically called.
    }  // SPSite object siteCollection.Dispose() automatically called.
 

Comments:
Best way to use when foreach loop is implemented with AllWebs collection. The above snippet will affectively disposes SPWeb object.

Best Coding Practice #6


    using (SPSite siteCollection = new SPSite("http://moss"))
    {
        SPWeb rootWeb1 = siteCollection.RootWeb;
        // No explicit rootWeb1 dispose required.
    }  // siteCollection automatically disposed by implementing using().
    // rootWeb1 will be Disposed by SPSite.

    // SPContext and SPControl
    SPWeb rootWeb2 = SPContext.Current.Site.RootWeb;
    // Also would apply to SPControl.GetContextSite(Context);
    // No explicit rootWeb2 dispose required because it's obtained from SPContext.Current.Site.
 

Comments:
It is not advisable to call the Dispose method on the SPSite.RootWeb

Best Coding Practice #7

using (SPSite site = new SPSite("http://moss")) 
{
    using (SPWeb web = site.OpenWeb())
    {
        SPList list = web.Lists["Announcements"];
        SPWeb parentWeb = list.ParentWeb; //No explicit dispose required.
    }
}
 

Comments:
No explicit dispose required for the SPWeb object returned by parentWeb. The dispose cleanup is handled automatically by the SharePoint framework.


Conclusion

Keeping in mind of better ways of using SharePoint objects and best coding practices as above will increase the performance of the application and also ensure the reliability.

June 12, 2014 В· Adi В· No Comments
Tags: , , ,  В· Posted in: Best Practices and Standards, C#, Sharepoint 2010, SharePoint 2013

Leave a Reply

What is 15 + 4 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)