Pole danych w klasie może być dowolnego typu. Gdy tworzymy nowy obiekt, w pamięci przydzielane jest miejsce na każde pole w danym obiekcie. Istnieją jednak przypadki gdy wartość danego pola powinna być taka sama dla wszystkich obiektów. Możemy to osiągnąć dzięki słowu kluczowemu static. Gdy dopiszemy je do definicji pola, będzie ono „wspólne” dla wszystkich obiektów.

Pole którego wartość tyczy się danego obiektu i jej zmiana będzie widoczna tylko w nim nosi nazwę pola instancyjnego. Natomiast pole, którego wartość jest wspólna dla wszystkich obiektów danej klasy i jej zmiana wpływa na wszystkie obiekty nosi nazwę pola statycznego.
Zobaczmy przykład:
Stwórzmy najpierw klasę bez pola „wspólnego” dla obiektów danej klasy:

 class Program {
    static void Main() {
        KlasaA obiekt1 = new KlasaA();
        KlasaA obiekt2 = new KlasaA();

        obiekt1.nazwa = "Testowy1";
        obiekt1.zmienna1 = 101;
        obiekt1.zmienna2 = 153;
        obiekt2.nazwa = "Testowy2";
        obiekt2.zmienna1 = 10;
        obiekt2.zmienna2 = 15;
        Console.WriteLine("Wartości dla obiektów przed zmianami");
        obiekt1.Show();
        obiekt2.Show();
        obiekt2.zmienna1 = 15;
        Console.WriteLine("Wartości dla obiektów po zmianach");
        obiekt1.Show();
        obiekt2.Show();
        Console.ReadLine();
    }
    class KlasaA  {
        //POLA
        public string nazwa;
        public double zmienna1;
        public double zmienna2;
        //METODY
        public void Show() {
            Console.WriteLine("obiekt o naziwe {0}", nazwa);
            Console.WriteLine("Wwartość zmiennej1 wynosi: {0}",zmienna1);
            Console.WriteLine("Wartość zmiennej2 wynosi {0}",zmienna2);
        }  
    }
}

Rezultat działania aplikacji:

1

Rys. Wyświetlenie wartości dla obiektów.

Zmieńmy teraz naszą klasę i zmieńmy definicję zmiennej o nazwie zmienna1 aby była statyczna:

class KlasaA  {
        //POLA
        public string nazwa;
        public static double zmienna1= 3;
        public double zmienna2;
        //METODY
        public void Show() {
            Console.WriteLine("obiekt o naziwe {0}", nazwa);
            Console.WriteLine("Wwartość zmiennej1 wynosi: {0}",zmienna1);
            Console.WriteLine("Wartość zmiennej2 wynosi {0}",zmienna2);
        }  
    }

Po takiej zmianie nie możemy zmienić wartości tej zmiennej z poziomu obiektu danej klasy zobaczmy przykład:

static void Main() {
        KlasaA obiekt1 = new KlasaA();
        KlasaA obiekt2 = new KlasaA();

        obiekt1.nazwa = "Testowy1";
        obiekt1.zmienna1 = 101;
        obiekt1.zmienna2 = 153;
        obiekt2.nazwa = "Testowy2";
        obiekt2.zmienna1 = 10;
        obiekt2.zmienna2 = 15;
        Console.WriteLine("Wartości dla obiektów przed zmianami");
        obiekt1.Show();
        obiekt2.Show();
       
        Console.WriteLine("Wartości dla obiektów po zmianach");
        obiekt1.Show();
        obiekt2.Show();
        Console.ReadLine();
    }

Kompilator zgłosi nam następujący błąd:

2

Rys. Błąd zgłoszony przez kompilator.

Jak widzimy nie możemy poprzez obiekt zmieniać wartości zmiennej statycznej. Możemy to zrobić z poziomu samej klasy, zobaczmy przykład:

using System;
class Program {
    static void Main() {
        KlasaA obiekt1 = new KlasaA();
        KlasaA obiekt2 = new KlasaA();

        obiekt1.nazwa = "Testowy1";     
        obiekt1.zmienna2 = 153;
        obiekt2.nazwa = "Testowy2";   
        obiekt2.zmienna2 = 15;
        Console.WriteLine("Wartości dla obiektów przed zmianami");
        obiekt1.Show();
        obiekt2.Show();
       
        Console.WriteLine("Wartości dla obiektów po zmianach");
        KlasaA.zmienna1 = 102;
        obiekt1.Show();
        obiekt2.Show();
        Console.ReadLine();
    }
    class KlasaA  {
        //POLA
        public string nazwa;
        public static double zmienna1=3;
        public double zmienna2;
        //METODY
        public void Show() {
            Console.WriteLine("obiekt o naziwe {0}", nazwa);
            Console.WriteLine("Wwartość zmiennej1 wynosi: {0}",zmienna1);
            Console.WriteLine("Wartość zmiennej2 wynosi {0}",zmienna2);
        }  
    }

}

Rezultat działania aplikacji:

3

Rys. Wyświetlenie wartości dla obiektów.

Jak widzimy wartość zmiennej o nazwie zmienna1 jest „wspólna” dla wszystkich obiektów danej klasy.

Podsumowanie:
Używając statycznych pól danych wpływamy pozytywnie na wydajność programu. Musimy pamiętać o tym, że pole statyczne ma wartość „wspólną” dla wszystkich obiektów. Jeszcze jedną zaletą ich stosowania jest pozbycie się problemu aktualizacji dla wartości danego pola w każdym utworzonym obiekcie. Oczywiście stworzenie statycznego pola musi być uzasadnione.