8
votes

According to Jon Skeet's artice C# and beforefieldinit and discussion in When is a static constructor called in C#? static constructor must be called before first call to a method of the class.

For some reason following code does not exhibit this behavior:

namespace AbstractAndStatic
{
    class Program
    {
        static void Main(string[] args)
        {
            StaticClass.Equals(1,2);
            StaticClass.foo();
        }
    }
    static class StaticClass : Object
    {
        public static void foo()
        {
            Console.WriteLine("Static");
        }
         static StaticClass()
        {
            Console.WriteLine("static constructor");
        }
    }
    class TestClass
    {
        public void deb()
        {
            Console.WriteLine("Test Class Debug");
        }
    }
}     

I am debugging the above code using the Visual Studio Debugger. When the statement StaticClass.Equals(1,2); gets executed in the Main method the static Constructor is not getting called but when StaticClass.foo(); is executed it calls static constructor and then call the foo method.

I am little confused as why it didn't get called the the first time when executing StaticClass.Equals(1,2);.

1
I believe you need to override Object.Equals. As it stands, it's calling the base version. Every class inherits from object btw, so not necessary to do it manually. - Trevor Ash
Where is your Equals() method written? - Microsoft DN
@MicrosoftDN its inherited from Object.Equals - Ron Beyer
@RonBeyer: No, it's calling the static Equals(Object, Object) method. - Jon Skeet
@JonSkeet Figured that out about 30 seconds before you posted that :) - Ron Beyer

1 Answers

13
votes

Your call to StaticClass.Equals is actually just a call to Object.Equals(Object, Object), as StaticClass doesn't provide an applicable overload for Equals. If you look in the IL, you'll see that the compiler has resolved the call to just Object.Equals(1, 2). If you're not calling a method which actually involves the static class, it doesn't need to be initialized.