Click here to Skip to main content
15,870,297 members
Articles / Programming Languages / C#
Article

Static Keyword Demystified

Rate me:
Please Sign up or sign in to vote.
4.69/5 (155 votes)
5 Oct 20065 min read 417.6K   136   85
This article aims to clear the confusion regarding the use of the static keyword in C#.

Introduction

What is the difference between a static class and a static member variable or method? I have asked this question in most of my interviews, and most of the time, it confuses candidates. So I thought of writing an informative article on it so that the difference is comprehensible, and fellow developers can add more information/valuable points.

Static Demystified

Let's start with the memory first. Whenever a process is loaded in the RAM, we can say that the memory is roughly divided into three areas (within that process): Stack, Heap, and Static (which, in .NET, is actually a special area inside Heap only known as High Frequency Heap).

The static part holds the “static” member variables and methods. What exactly is static? Those methods and variables which don't need an instance of a class to be created are defined as being static. In C# (and Java too), we use the static keyword to label such members as static. For e.g.:

C#
class MyClass
{
    public static int a;
    public static void DoSomething();
}

These member variables and methods can be called without creating an instance of the enclosing class. E.g., we can call the static method DoSomething() as:

C#
MyClass.DoSomething();

We don't need to create an instance to use this static method.

C#
MyClass m = new MyClass();
m.DoSomething();
//wrong code. will result in compilation error.

An important point to note is that the static methods inside a class can only use static member variables of that class. Let me explain why:

Suppose you have a private variable in MyClass which is not static:

C#
class MyClass
{
    // non-static instance member variable
    private int a;
    //static member variable
    private static int b;
    //static method
    public static void DoSomething()
    {
      //this will result in compilation error as "a" has no memory
      a = a + 1;
      //this works fine since "b" is static
      b = b + 1;
    }
}

Now, we will call the DoSomething method as:

C#
MyClass.DoSomething();

Note that we have not created any instance of the class, so the private variable "a" has no memory as when we call a static method for a class, only the static variables are present in the memory (in the Static part). Instance variables, such as “a” in the above example, will only be created when we create an instance of the class using the “new” keyword, as:

C#
MyClass m = new MyClass();  //now "a" will get some memory

But since we haven’t created an instance yet, the variable “a” is not there in the process memory. Only “b” and “DoSomething()” are loaded. So when we call DoSomething(), it will try to increment the instance variable “a” by 1, but since the variable isn’t created, it results in an error. The compiler flags an error if we try to use instance variables in static methods.

Now, what is a static class? When we use the static keyword before a class name, we specify that the class will only have static member variables and methods. Such classes cannot be instantiated as they don’t need to: they cannot have instance variables. Also, an important point to note is that such static classes are sealed by default, which means they cannot be inherited further.

This is because static classes have no behavior at all. There is no need to derive another class from a static class (we can create another static class).

Why do we need static classes? As already written above, we need static classes when we know that our class will not have any behavior as such. Suppose we have a set of helper or utility methods which we would like to wrap together in a class. Since these methods are generic in nature, we can define them all inside a static class. Remember that helper or utility methods need to be called many times, and since they are generic in nature, there is no need to create instances. E.g., suppose that you need a method that parses an int to a string. This method would come in the category of a utility or helper method.

So using the static keyword will make your code a bit faster since no object creation is involved.

An important point to note is that a static class in C# is different from one in Java. In Java, the static modifier is used to make a member class a nested top level class inside a package. So using the static keyword with a class is different from using it with member variables or methods in Java (static member variables and methods are similar to the ones explained above in C#).

Please see the following link for details:

Also, the static keyword in C++ is used to specify that variables will be in memory till the time the program ends; and initialized only once. Just like C# and Java, these variables don’t need an object to be declared to use them. Please see this link for the use of the static keyword in C++:

Writing about the const keyword brings me to a subtle but important distinction between const and readonly keywords in C#: const variables are implicitly static and they need to be defined when declared. readonly variables are not implicitly static and can only be initialized once.

E.g.: You are writing a car racing program in which the racing track has a fixed length of 100 Km. You can define a const variable to denote this as:

C#
private const int trackLength = 100;

Now, you want the user to enter the number of cars to race with. Since this number would vary from user to user, but would be constant throughout a game, you need to make it readonly. You cannot make it a const as you need to initialize it at runtime. The code would be like:

C#
public class CarRace
{
    //this is compile time constant
    private const int _trackLength = 100;
    //this value would be determined at runtime, but will
    //not change after that till the class's 
    //instance is removed from memory
    private readonly int _noOfCars;

    public CarRace(int noOfCars)
    {}

    public CarRace(int noOfCars)
    {
        ///<REMARKS>
        ///Get the number of cars from the value 
        ///use has entered passed in this constructor
        ///</REMARKS>
        _noOfCars = noOfCars;
    }       
}

Summary

We examined the static keyword in C#, and saw how it helps in writing good code. It is best to think and foresee possible uses of the static keyword so that the code efficiency, in general, increases.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Founder Axero Solutions LLC
United States United States
Vivek is the co-founder of Communifire, a social business software platform that drives business growth. You can collaborate with anyone, provide better customer support, power your company intranet, build a knowledge base, and launch online communities for anything -- and more -- all in one integrated platform.

Link: http://axerosolutions.com

Comments and Discussions

 
Generalyeah helpful Pin
abcdefgqwerty24-Apr-07 7:37
abcdefgqwerty24-Apr-07 7:37 
GeneralGreat article! Well done! Pin
yair200623-Apr-07 23:48
yair200623-Apr-07 23:48 
GeneralIt was Simple and Superb Pin
hiramprasad12-Apr-07 20:58
hiramprasad12-Apr-07 20:58 
GeneralEnjoyed your article Pin
GaryWoodfine 10-Oct-06 11:21
professionalGaryWoodfine 10-Oct-06 11:21 
GeneralRe: Enjoyed your article Pin
Vivek Thakur12-Oct-06 1:14
professionalVivek Thakur12-Oct-06 1:14 
Generalstatic vs const in C++ Pin
byo4-Oct-06 21:46
byo4-Oct-06 21:46 
GeneralRe: static vs const in C++ Pin
Vivek Thakur4-Oct-06 23:58
professionalVivek Thakur4-Oct-06 23:58 
NewsShared (VB) vs Static (C#) Pin
rlivelyppk4-Oct-06 4:05
rlivelyppk4-Oct-06 4:05 
GeneralRe: Shared (VB) vs Static (C#) Pin
Vivek Thakur4-Oct-06 9:23
professionalVivek Thakur4-Oct-06 9:23 
GeneralRe: Shared (VB) vs Static (C#) Pin
GaryWoodfine 10-Oct-06 11:16
professionalGaryWoodfine 10-Oct-06 11:16 
QuestionWhat is the difference between a static class and a static member variable or method? Pin
danidanidani2-Oct-06 4:21
danidanidani2-Oct-06 4:21 
AnswerRe: What is the difference between a static class and a static member variable or method? Pin
Jon Rista2-Oct-06 7:09
Jon Rista2-Oct-06 7:09 
JokeRe: What is the difference between a static class and a static member variable or method? Pin
danidanidani2-Oct-06 7:31
danidanidani2-Oct-06 7:31 
AnswerRe: What is the difference between a static class and a static member variable or method? Pin
Vivek Thakur3-Oct-06 7:08
professionalVivek Thakur3-Oct-06 7:08 
GeneralRe: What is the difference between a static class and a static member variable or method? Pin
ttobler3-Oct-06 7:55
ttobler3-Oct-06 7:55 
AnswerRe: What is the difference between a static class and a static member variable or method? Pin
Muhammet Sait YILDIZ12-Oct-06 0:15
Muhammet Sait YILDIZ12-Oct-06 0:15 
GeneralSlightly incorrect statement... Pin
Jon Rista30-Sep-06 15:47
Jon Rista30-Sep-06 15:47 
GeneralRe: Slightly incorrect statement... Pin
Vivek Thakur1-Oct-06 1:28
professionalVivek Thakur1-Oct-06 1:28 
GeneralRe: Slightly incorrect statement... [modified] Pin
Jon Rista1-Oct-06 17:08
Jon Rista1-Oct-06 17:08 
GeneralRe: Slightly incorrect statement... Pin
Vivek Thakur1-Oct-06 20:52
professionalVivek Thakur1-Oct-06 20:52 
GeneralRe: Slightly incorrect statement... Pin
Jon Rista2-Oct-06 7:07
Jon Rista2-Oct-06 7:07 
QuestionDifferences between static class and namespace ? Pin
Defenestration29-Sep-06 13:57
Defenestration29-Sep-06 13:57 
AnswerRe: Differences between static class and namespace ? Pin
ttobler3-Oct-06 2:13
ttobler3-Oct-06 2:13 
GeneralExcellent Pin
pradeep kumarappagari29-Aug-06 20:35
pradeep kumarappagari29-Aug-06 20:35 
GeneralRe: Excellent Pin
Vivek Thakur29-Aug-06 21:25
professionalVivek Thakur29-Aug-06 21:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.