C#. Статические методы и не только

Ключевое слово static

В этой статье я хочу рассказать об использовании ключевого слова static в программах, написанных на C#. Это ключевое слово может относится (может быть указано) к методам, полям, свойствам, событиям, конструкторам, операторам классов (и даже к самим классам, но об этом будет отдельный разговор). Ключевое слово static, указанное перед какой-либо сущностью класса, делает её статической. Это значит то, что данная сущность принадлежит не конкретному объекту класса, а всему классу, как типу данных. Другими словами, если обычное поле класса принадлежит объекту, и у каждого конкретного объекта есть как бы своя копия данного поля, то статическое поле одно для всего класса. Для примера, посмотрите на код ниже:

//Класс, описывающий студента
class Student
{
    //Обычный (не статический) конструктор класса
    public Student(string aName)
    {
       name = aName;
    }

    //Обычное (не статическое) свойство класса
    public string Name { get { return name; } set { name = value; } }

    //Обычное (не статическое) поле класса
    private string name; //Имя студента
}

Так вот, при создании объектов этого класса, для для каждого из них индивидуально будет вызываться конструктор, каждый объект будет иметь свою «копию» поля «name» и свойство «Name» будет возвращать именно его. Но иногда, мы хотим иметь сущности, которые относятся не к каждому отдельно взятому объекту, а ко всему классу.

На самом деле, когда мы объявляем в классе константу, она уже по сути, относится ко всему класса, так как для всех объектов будет имеет одно и тоже значение.

Для чего это может пригодиться? Ну например, мы разрабатываем класс, и хотим, что бы его пользователи знали, кем и для чего разработан этот класс (хотя, соглашусь, пример сильно надуманный):

//Класса, описывающий студента
class Student
{ 
    //Обычный (не статический) конструктор класса
    public Student(string aName)
    {
       name = aName;
    }

    //Обычное (не статическое) свойство класса
    public string Name { get { return name; } set { name = value; } }

    //Статическое свойство класса
    public static string About { get { return about; } }

    //Обычное (не статическое) поле класса
    private string name; //Имя студента

    //Статическое поле класса
    private static string about = "Класс, для представления простых студентов в программах, написанных на C#";
}

Как видите, мы добавили в класс статическое поле «about«, с информацией о предназначении класса и статическое свойство (только для чтения) «About» для возврата значения этого поля. А теперь, я покажу как можно воспользоваться статическим свойством приведенного выше класса:

//Вывод в консоль информации о классе Student
Console.WriteLine(Student.About);

Все довольно просто, для вызова статического свойства класса, нам даже не нужно создавать объект этого класса (и действительно, зачем это делать, если статические сущности относятся не к конкретным объектам, а ко всему классу). Мы просто пишем имя класса (в данном случае, это «Student»), а потом, через точку, имя свойства. Точно так же производится работа со статическими методами, например, статический метод, возвращающий значение поля «about» может выглядеть примерно так:

//Статический метод класса
public static string GetInfo() { return about; }

А его вызов вот так:

//Вывод в консоль информации о классе Student
Console.WriteLine(Student.GetInfo());

Как видно, мы и тут не создавали ни какие объекты! И эта особенность, может быть полезна! Ведь действительно, не всегда хочется создавать новый объект, всего лишь для того, чтобы вызвать один метод (не имеющий к объекту ни какого отношения)… Например, нам понадобилось написать метод, который принимает два целочисленных аргумента и возвращает их сумму. Такой метод не работает с полями объекта, на котором он вызывается, никак их не анализирует, не изменяет. И тут просто само собой напрашивается решение сделать этот метод статическим. Выглядеть такой класс может так:

//Класс, реализующий некие операции
class Operations
{
    //Статический метод, принимающий два целых числа и возвращающий их сумму
    public static int Sum(int aFirstArg, int aSecondArg)
    {
        return aFirstArg + aSecondArg;
    }
}

Использовать такой класс можно так:

//Сложить два числа и вывести результат в консоль
Console.WriteLine(Operations.Sum(5, 15));

Видите как всё просто… Не нужно создавать никакие объекты для выполнения необходимой операции!

Примером класса, с большим набором статических методов, выполняющих математические операции, служит стандартный класс Math (из пространства имен System). На самом деле, этот класс вообще является статическим, т.е. при его создании, перед словом class, было указано ключевое слово static. Но о том что такое статические классы и в чем их особенности, я расскажу в следующей статье.

И еще, хочу сказать пару слов про статические конструкторы:

  • у класса может быть только один статический конструктор;
  • у статического конструктора не может быть ни аргументов ни модификатора доступа (такого как public, private и т.п.);
  • статический конструктор вызывается автоматически системой и один раз (либо при создании первого объекта класса, либо при первом обращении к статической сущности класса);
  • ну и самое главное, статический конструктор предназначен для инициализации статических полей класса.

Для класса «Student», статический конструктор может выглядеть примерно так:

//Статический конструктор класса
static Student()
{
    about = "Класс, для представления простых студентов в программах, написанных на C#";
}

Добавить комментарий