Ранее, чтобы использовать какой-нибудь класс, устанавливать и получать его поля, использовать его методы, мы создавали его объект. Однако если данный класс имеет статические методы, то, чтобы получить к ним доступ, необязательно создавать объект этого класса. Например, создадим новый класс 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
{
//............
}