Ключевое слово static
В этой статье я хочу рассказать об использовании ключевого слова static в программах, написанных на C#.
Это ключевое слово может относится (может быть указано) к методам, полям, свойствам, событиям, конструкторам, операторам классов (и даже к самим классам, но об этом будет отдельный разговор).
Ключевое слово static, указанное перед какой-либо сущностью класса, делает её статической.
Это значит то, что данная сущность принадлежит не конкретному объекту класса, а всему классу, как типу данных.
Другими словами, если обычное поле класса принадлежит объекту, и у каждого конкретного объекта есть как бы своя копия данного поля, то статическое поле одно для всего класса. Для примера, посмотрите на код ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //Класс, описывающий студентаclass Student{ //Обычный (не статический) конструктор класса public Student(string aName) { name = aName; } //Обычное (не статическое) свойство класса public string Name { get { return name; } set { name = value; } } //Обычное (не статическое) поле класса private string name; //Имя студента} |
Так вот, при создании объектов этого класса, для для каждого из них индивидуально будет вызываться конструктор, каждый объект будет иметь свою «копию» поля «name» и свойство «Name» будет возвращать именно его. Но иногда, мы хотим иметь сущности, которые относятся не к каждому отдельно взятому объекту, а ко всему классу.
Для чего это может пригодиться? Ну например, мы разрабатываем класс, и хотим, что бы его пользователи знали, кем и для чего разработан этот класс (хотя, соглашусь, пример сильно надуманный):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //Класса, описывающий студента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» для возврата значения этого поля. А теперь, я покажу как можно воспользоваться статическим свойством приведенного выше класса:
1 2 | //Вывод в консоль информации о классе StudentConsole.WriteLine(Student.About); |
Все довольно просто, для вызова статического свойства класса, нам даже не нужно создавать объект этого класса (и действительно, зачем это делать, если статические сущности относятся не к конкретным объектам, а ко всему классу). Мы просто пишем имя класса (в данном случае, это «Student»), а потом, через точку, имя свойства. Точно так же производится работа со статическими методами, например, статический метод, возвращающий значение поля «about» может выглядеть примерно так:
1 2 | //Статический метод классаpublic static string GetInfo() { return about; } |
А его вызов вот так:
1 2 | //Вывод в консоль информации о классе StudentConsole.WriteLine(Student.GetInfo()); |
Как видно, мы и тут не создавали ни какие объекты! И эта особенность, может быть полезна! Ведь действительно, не всегда хочется создавать новый объект, всего лишь для того, чтобы вызвать один метод (не имеющий к объекту ни какого отношения)… Например, нам понадобилось написать метод, который принимает два целочисленных аргумента и возвращает их сумму. Такой метод не работает с полями объекта, на котором он вызывается, никак их не анализирует, не изменяет. И тут просто само собой напрашивается решение сделать этот метод статическим. Выглядеть такой класс может так:
1 2 3 4 5 6 7 8 9 | //Класс, реализующий некие операцииclass Operations{ //Статический метод, принимающий два целых числа и возвращающий их сумму public static int Sum(int aFirstArg, int aSecondArg) { return aFirstArg + aSecondArg; }} |
Использовать такой класс можно так:
1 2 | //Сложить два числа и вывести результат в консольConsole.WriteLine(Operations.Sum(5, 15)); |
Видите как всё просто… Не нужно создавать никакие объекты для выполнения необходимой операции!
И еще, хочу сказать пару слов про статические конструкторы:
- у класса может быть только один статический конструктор;
- у статического конструктора не может быть ни аргументов ни модификатора доступа (такого как public, private и т.п.);
- статический конструктор вызывается автоматически системой и один раз (либо при создании первого объекта класса, либо при первом обращении к статической сущности класса);
- ну и самое главное, статический конструктор предназначен для инициализации статических полей класса.
Для класса «Student», статический конструктор может выглядеть примерно так:
1 2 3 4 5 | //Статический конструктор классаstatic Student(){ about = "Класс, для представления простых студентов в программах, написанных на C#";} |
Добавить комментарий