Статические члены класса

Ранее, чтобы использовать какой-нибудь класс, устанавливать и получать его поля, использовать его методы, мы создавали его объект. Однако если данный класс имеет статические методы, то, чтобы получить к ним доступ, необязательно создавать объект этого класса. Например, создадим новый класс Algorithm и добавим в него две функции для вычисления числа Фибоначчи и факториала:

class Algorithm

{

public static double pi = 3.14;

 

public static int Factorial(int x)

{

   if (x == 1)

   {

       return 1;

   }

   else

   {

       return x * Factorial(x - 1);

   }

}

public static int Fibonachi(int x)

{

   if (x == 0)

   {

       return 1;

   }

   if (x == 1)

   {

       return 1;

   }

   else

   {

       return Fibonachi(x - 1) + Fibonachi(x - 2);

   }

}

}

Ключевое слово static при определении переменной и методов указывает, что данные члены будут доступны для всего класса, то есть будут статическими. Теперь используем их в программе:

int num1 = Algorithm.Factorial(5);

int num2 = Algorithm.Fibonachi(5);

 

Algorithm.pi = 3.14159;

При использовании статических членов класса нам необязательно создавать экземпляр класса, а мы можем обратиться к ним напрямую.

На уровне памяти для статических полей будет создаваться участок в памяти, который будет общим для всех объектов класса. Например, если мы создадим два объекта класса Algorithm:

Algorithm algorithm1 = new Algorithm();

Algorithm algorithm2 = new Algorithm();

То оба этих объекта будут хранить ссылку на один участок в памяти, где хранится значение pi:

Нередко статические поля применяются для хранения счетчиков. Например, пусть у нас есть класс State, и мы хотим иметь счетчик, который позволял бы узнать, сколько объектов State создано:

class State

{

private static int counter = 0;

public State()

{

   counter++;

}

 

public static void DisplayCounter()

{

   Console.WriteLine("Создано {0} объектов State", counter);

}

}

class Program

{

static void Main(string[] args)

{

   State state1 = new State();

   State state2 = new State();

   State state3 = new State();

   State state4 = new State();

   State state5 = new State();

 

   State.DisplayCounter(); // 5

 

   Console.Read();

}

}

Статический конструктор

Кроме обычных конструкторов у класса также могут быть статические конструкторы. Статические конструкторы выполняются при самом первом создании объекта данного класса или первом обращении к его статическим членам (если таковые имеются):

class State

{

static State()

{

   Console.WriteLine("Создано первое государство");

}

}

class Program

{

static void Main(string[] args)

{

   State s1 = new State(); // здесь сработает статический конструктор

   State s2 = new State();

                              

   Console.ReadLine();

}

}

Статические классы

Статические классы объявляются с модификатором static и могут содержать только статические поля и методы. Например, в примерах выше класс Algorithm имел только статические поля и методы. Нам не надо создавать объект этого класса, чтобы использовать его функциональность. Поэтому данный класс можно объявить как статический:

static class Algorithm

{

           //............

}

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: