Wednesday, February 11, 2015

Difference Between String And StringBuilder In C#

Please Find Original Post From here

Introduction

It is one of the frequently asked question in all interviews and all of us answer something in common
String is Immutable and StringBuilder is Mutable
 This is a one word answer. In this article I would like to dig things in more details

Please Find Original Post From here

Don't Ignore Basics

             Both String and Stringbuilder represent sequence of characters. When we list out their differences some of us don't remember basic difference. That is String Class is in the System Namespace While StringBuilder is in System.Text.

Some Times Mute Is Safe 

          Let us make the statement again "String is Immutable and StringBuilder is Mutable" [Don't be Confused about which one is mutable and which one is not].

        Immutability of string object Means, If any of your operation on the string instance changes it's value, it will end up in the creation of new instance in a different address location with modified value. Mutability of StringBuilder is just opposite for this.It won't create new instance when their content changes as string does.Instead it makes the new changes in the same instance.

Mutability and Immutability of these two can be understood from following C# Program.
        
using System;
using System.Text;

namespace StringVsStringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            String str = "My first string was ";
            str += "Hello World";
            //Now str="My first string was Hello World"
            StringBuilder sbr = new StringBuilder("My Favourite Programming Font is ");
            sbr.Append("Inconsolata");
            //Now sbr="My Favourite Programming Font is Inconsolata"
            Console.ReadKey();
        }
    }
}

in line 11 content of str changes, so new instance is created and new value is stored in it as shown below


even though line 14 changes the value stringbuilder sbr it won't create a new instead it will keep appending new strings to existing instance.see how it looks in terms of memory


Because of this behaviour of StringBuilder it also known as Mutable String.

Please Find Original Post From here



{}I'm not convinced

     If you say I'm not convinced.let us check these behaviours using  C# code snippet.For that i am using a C# class ObjectIDGenerator(in System.Runtime.Serialization Namespace).Actually it will return an unique integer value for instances that we created in our programs.With the help of this class we can check whether new instance is created or not for various operations on string and stringbuilder .Consider following program

using System;
using System.Text;
using System.Runtime.Serialization;

namespace StringVsStringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectIDGenerator idGenerator = new ObjectIDGenerator();
            bool blStatus=new bool();
            //just ignore this blStatus Now.
            String str = "My first string was ";
            Console.WriteLine("str = {0}",str);
            Console.WriteLine("Instance Id : {0}",idGenerator.GetId(str,out blStatus));
            //here blStatus get True for new instace otherwise it will be false
            Console.WriteLine("this instance is new : {0}\n",blStatus);
            str += "Hello World";
            Console.WriteLine("str = {0}", str);
            Console.WriteLine("Instance Id : {0}", idGenerator.GetId(str, out blStatus));
            Console.WriteLine("this instance is new : {0}\n", blStatus);
            //Now str="My first string was Hello World"
            StringBuilder sbr = new StringBuilder("My Favourate Programming Font is ");
            Console.WriteLine("sbr = {0}", sbr);
            Console.WriteLine("Instance Id : {0}", idGenerator.GetId(sbr, out blStatus));
            Console.WriteLine("this instance is new : {0}\n", blStatus);
            sbr.Append("Inconsolata");
            Console.WriteLine("sbr = {0}", sbr);
            Console.WriteLine("Instance Id : {0}", idGenerator.GetId(sbr, out blStatus));
            Console.WriteLine("this instance is new : {0}\n", blStatus);
            //Now sbr="My Favourate Programming Font is Inconsolata"
            Console.ReadKey();
        }
    }
}


Output Will look like this

        Did you see that..?, Instance id for string get changed from 1 to 2 when str concatenated with "Hello World".while instance id of sbr remains same as 3 after append operation also. This tells all about mutability and immutability.blStatus in my program tells whether the instance is new or not. Now you are convinced right?

Who Run Faster?

           Let's discuss performance difference between string and stringbuilder.The following code box will explain things simply.Before that if you don't how to measure execution time in C# please read my article from here .
using System;
using System.Text;
using System.Diagnostics;

namespace StringVsStringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch Mytimer = new Stopwatch();
            string str = string.Empty;
            Mytimer.Start();
            for (int i = 0; i < 10000; i++)
            {
                str += i.ToString();
            }
            Mytimer.Stop();
            Console.WriteLine("Time taken by string : {0}",Mytimer.Elapsed);
            StringBuilder sbr = new StringBuilder(string.Empty);
            //restart timer from zero
            Mytimer.Restart();
            for (int i = 0; i < 10000; i++)
            {
                sbr.Append(i.ToString());
            }
            Mytimer.Stop();
            Console.WriteLine("Time taken by stringbuilder : {0}", Mytimer.Elapsed);
            Console.ReadKey();
        }
    }
}
Output of this program was
This output speaks everything.StringBuilder is about 70X faster than String in my laptop.it might be different in your case but generally speaking stringbuilder gives 10x times speed than string.

One Last Thing

New Instance of string will be created only when it's value changes
     One more thing,If you do an operation on a string variable, Creation of new instance occurs only when it's current value changes.try following code

using System;
using System.Text;
using System.Runtime.Serialization;

namespace StringVsStringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectIDGenerator idGenerator = new ObjectIDGenerator();
            bool blStatus = new bool();
            string str = "Fashion Fades,Style Remains Same";
            Console.WriteLine("initial state");
            Console.WriteLine("str = {0}",str);
            Console.WriteLine("instance id : {0}",idGenerator.GetId(str,out blStatus));
            Console.WriteLine("this is new instance : {0}",blStatus);
            //a series of operations that won't change value of str
            str += "";
            //try to replace character 'x' which is not present in str so no change
            str = str.Replace('x','Q');
            //trim removes whitespaces from both ends so no change
            str = str.Trim();
            str = str.Trim();
            Console.WriteLine("\nfinal state");
            Console.WriteLine("str = {0}", str);
            Console.WriteLine("instance id : {0}", idGenerator.GetId(str, out blStatus));
            Console.WriteLine("this is new instance : {0}", blStatus);
            Console.ReadKey();
        }
    }
}

Output!

initial and final id is 1-means new instance is not created for these operation since it does not change the value of str.You may wonder about how compiler shows this intelligence.

Shoot Your Doubts

»Should I Use StringBuilder Everywhere? Ans

»Why .NET String is immutable? Ans

Please Find Original Post From here

---Done Folks.Happy Coding --
»Keep Sharing and Learning«

video tutorial


2 comments: