Skip to main content

Back To Basics - Extension Methods in C# - A Brief Note



About Back To Basics - It's often good to look back and fill any gaps we might be having, in certain aspects of the language or framework we use. I'll be examining and blogging about some well known features of C# and .NET, in Back To Basics series - Probably in a bit more detail.




Extension methods, introduced in Orcas, seems very interesting. First of all, here is a brief look at what they are. Extension methods can be created for existing framework classes, or for the classes that you created yourself.

For instance - one fine day, I might think that for my console application; the Framework’s String class should have a Dump method for allowing me to dump the string directly to the console.
So I’ll go ahead and create an extension method called Dump.

Using this key word in the parameter signature tells the compiler to apply our Dump extension method to the String class. Also, note that both the Dump extension method and the StringExtensions class where we define the extension method, are static.
Now, I can import the namespace ExtensionDemo.Extensions and our Dump extension method will be ‘mapped’ to the type you specified using this keyword in the parameter signature of your extension method – i.e, the String class.
You can go ahead and call your extension method, much like you call any other method defined in the String class, as shown below.

Note that there is a small arrow in intellisense near the Dump method, which represents that it is an extension method. Also, as you might know, even this is possible.

Run the application, and you see the string in the console.
Remember that Extension methods are a compiler feature. The compiler will expand an extension method call to a static method call when the application is compiled. Hence, you might say an extension method is a new way of writing static methods that can be called using instance method invocation syntax.
IL generated for the above extension method and method invocation will be equivalent to having a static method Dump() in StringExtensions class, and invoking the same using conventional static invocation, like this
//Conventional way to do what ever we've done earlier
//using extension methods

//StringExtensions.cs

using System;

namespace ExtensionDemo.Extensions
{
     
    public static class StringExtensions
    {
        //A simple old style static method

        public static void Dump(String stringToDump)
        {
            Console.WriteLine(stringToDump);
        }
    }
}

//Program.cs
//Old way of invoking the static method

using System.Text;
using ExtensionDemo.Extensions;

namespace ExtensionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string myString = "hello";
            StringExtensions.Dump(myString);
        }
    }
}

Here are few more pointers I can put together.
  • If you already have an instance method in your class with the same signature of an extension method you apply, the compiler will bind your call against the instance method.
  • Extension methods are brought into scope at the namespace level. In simple words, you can’t call the method Dump() on a string, if you don’t import the namespace where we have the static class with the extension method Dump() in it.
  • You should not use Extension methods to extend a class, if you can do that using some other means, like inheritance.
  • As you might assume, Extension methods can’t access private members of the type (because the type instance is passed as a parameter).
  • If the type you are applying the Extension method changes your code might break. For example, assume that you are accessing a property PropertyA in your extension method, and tomorrow some one changes the property name to PropertyB
  • Use Extension method sparingly and judiciously.
    Will be posting more on combining Lambda expressions with Extension methods, and finally some insights on LINQ as well.

Comments

  1. "As you might assume, Extension methods can’t access private members of the type"

    Damn, I guess it's not really "extending" then is it? I can't think of too many situations where this feature would be useful over existing methods. I suppose it can clean the syntax up a bit though.

    ReplyDelete
  2. Yes. But think about this. It is the only way to really 'extend' a compiled class :). As I explained in my example, you can use this to write custom methods for Framework classes. For example, LINQ uses extension methods to add methods like Where, Select etc to the existing IEnumerable interface.

    ReplyDelete

Post a Comment

Please keep your comments clean.

Popular posts from this blog

Top 7 Coding Standards & Guideline Documents For C#/.NET Developers

Some time back, I collated a list of 7 Must Read, Free EBooks for .NET Developers, and a lot of people found it useful. So, I thought about putting together a list of Coding Standard guidelines/checklists for .NET /C# developers as well.As you may already know, it is easy to come up with a document - the key is in implementing these standards in your organization, through methods like internal trainings, Peer Reviews, Check in policies, Automated code review tools etc. You can have a look at FxCop and/or StyleCop for automating the review process to some extent, and can customize the rules based on your requirements.Anyway, here is a list of some good Coding Standard Documents. They are useful not just from a review perspective - going through these documents can definitely help you and me to iron out few hidden glitches we might have in the programming portion of our brain. So, here we go, the listing is not in any specific order.1 – IDesign C# Coding StandardsIDesign C# coding stand…

Creating a quick Todo listing app on Windows using IIS7, Node.js and Mongodb

As I mentioned in my last post, more and more organizations are leaning towards Web Oriented Architecture (WOA) which are highly scalable. If you were exploring cool, scalable options to build highly performing web applications, you know what Node.js is for.After following the recent post from Scott Hanselman, I was up and running quickly with Node.js. In this post, I’ll explain step by step how I’ve setup Node.js and Mongodb to create a simple Todo listing application.Setting up Node.jsThis is what I’ve done.1 – Goto http://nodejs.org/, scroll down and download node.exe for Windows, and place it in your c:\node folder2 – Goto IIS Node project in Git at https://github.com/tjanczuk/iisnode, download the correct ‘retail’ link of IIS Node zip file (I downloaded the already built retail package, otherwise you can download and build from the source).3 – Extract the zip file some where, and run the install.bat or install_iisexpress.bat depending on your IIS Version. If you don’t have IIS in…

5 Awesome Learning Resources For Programmers (To help you and your kids to grow the geek neurons)

Happy New Year, this is my first post in 2012. I’ll be sharing few awesome learning resources I’ve bookmarked, and will be pointing out some specific computer/programming related courses I've found interesting from these resources.Also, thought about saving this blog post for my kids as well - instead of investing in these Child education schemes (though they are too small as of today, 2 years and 60 days respectively ). Anyway, personally my new year resolution is to see as much videos from this course collections (assuming I can find some free time in between my regular job && changing my babies diapers).1 – Khan AcademyAs I mentioned some time back, you and your kids are missing some thing huge if you havn’t heard about Khan Academy.  It is an awesome learning resource, especially if you want to re-visit your basics in Math, Science etc.With a library of over 2,600 videos covering everything from arithmetic to physics, finance, and history and 268 practice exercises, th…