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…

Hack Raspberry Pi – How To Build Apps In C#, WinForms and ASP.NET Using Mono In Pi

Recently I was doing a bit of R&D related to finding a viable, low cost platform for client nodes. Obviously, I came across Raspberry Pi, and found the same extremely interesting. Now, the missing piece of the puzzle was how to get going using C# and .NET in the Pi. C# is a great language, and there are a lot of C# developers out there in the wild who are interested in the Pi.In this article, I’ll just document my findings so far, and will explain how develop using C# leveraging Mono in a Raspberry Pi. Also, we’ll see how to write few minimal Windows Forms & ASP.NET applications in the Pie as well.Step 1: What is Raspberry Pi?Raspberry Pi is an ARM/Linux box for just ~ $30. It was introduced with a vision to teach basic computer science in schools. How ever, it got a lot of attention from hackers all around the world, as it is an awesome low cost platform to hack and experiment cool ideas as Pi is almost a full fledged computer.  More About R-Pi From Wikipedia.The Raspberry Pi

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…