Ключевое слово static в C#: статические переменные, методы и классы
Ключевое слово static в C#
Это руководство объясняет ключевое слово static в C#, охватывая статические переменные, методы и классы с понятными реальными примерами.
В C# применение ключевого слова static к члену создает единственный общий экземпляр для всех объектов этого типа. Вместо того чтобы каждый экземпляр хранил свою копию, статический член существует в единственном экземпляре на тип.
Статические переменные в C#
Когда поле объявлено static, к нему можно обращаться напрямую через имя класса, не создавая объект.
using System;
namespace StaticKeyword {
class Student {
// статическая переменная, общая для всех студентов
public static string department = "Computer Science";
}
class Program {
static void Main(string[] args) {
// Доступ к статическому полю через имя класса
Console.WriteLine("Department: " + Student.department);
Console.ReadLine();
}
}
}
Вывод
Department: Computer Science
Поле department разделяется всеми экземплярами Student, поэтому обращаемся как Student.department.
Статические переменные против переменных экземпляра
Переменные экземпляра принадлежат отдельным объектам, у каждого своя копия. Например:
class Student {
public string studentName;
}
class Program {
static void Main(string[] args) {
Student s1 = new Student();
Student s2 = new Student();
}
}
Здесь s1 и s2 имеют отдельные поля studentName. В отличие от этого, статическое поле общее для всех экземпляров и доступно без создания объекта.
Пример: Статические vs экземплярные переменные
using System;
namespace StaticKeyword {
class Student {
public static string schoolName = "Programiz School"; // общая
public string studentName; // уникальная
}
class Program {
static void Main(string[] args) {
Student s1 = new Student();
s1.studentName = "Ram";
Console.WriteLine("Name: " + s1.studentName); // экземпляр
Console.WriteLine("School: " + Student.schoolName); // статическое
Student s2 = new Student();
s2.studentName = "Shyam";
Console.WriteLine("Name: " + s2.studentName);
Console.WriteLine("School: " + Student.schoolName);
Console.ReadLine();
}
}
}
Вывод
Name: Ram School: Programiz School Name: Shyam School: Programiz School
Статическое поле schoolName идентично для всех студентов, что эффективно по памяти и логически последовательно.
Статические методы в C#
Статические методы вызываются на самом классе, а не на экземпляре. Они могут обращаться только к другим статическим членам.
class Test {
public static void Display() {
// реализация
}
}
class Program {
static void Main(string[] args) {
Test.Display();
}
}
Все объекты Test разделяют один метод Display, поэтому вызывают его через имя класса.
Пример: Статические и нестатические методы
using System;
namespace StaticKeyword {
class Test {
public void Display1() {
Console.WriteLine("Non static method");
}
public static void Display2() {
Console.WriteLine("Static method");
}
}
class Program {
static void Main(string[] args) {
Test t1 = new Test();
t1.Display1(); // вызов экземпляра
Test.Display2(); // статический вызов
Console.ReadLine();
}
}
}
Вывод
Non static method Static method
Примечание: Метод Main сам является статическим, позволяя запускаться без экземпляра.
Статические классы
Статический класс нельзя инстанцировать и может содержать только статические члены. Полезен для группировки вспомогательных методов.
using System;
namespace StaticKeyword {
static class Test {
static int a = 5;
static void Display() {
Console.WriteLine("Static method");
}
static void Main(string[] args) {
// Test t1 = new Test(); // ❌ Ошибка компиляции
Console.WriteLine(a);
Display();
}
}
}
Попытка инстанцировать Test вызывает ошибки CS0723 и CS0712, подтверждая статическую природу.
Статические классы нельзя наследовать. Например:
static class A { /* ... */ }
// class B : A { /* ... */ } // ❌ Ошибка
Доступ к статическим членам внутри класса
Внутри того же класса можно обращаться к статическим полям и методам напрямую, без квалификатора класса.
using System;
namespace StaticKeyword {
class Test {
static int age = 25;
public static void Display() {
Console.WriteLine("Static method");
}
static void Main(string[] args) {
Console.WriteLine(age); // прямой доступ
Display(); // прямой доступ
Console.ReadLine();
}
}
}
Вывод
25 Static method
Здесь age и Display используются без префикса Test..
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Модификаторы доступа в C#: public, private, protected, internal и другие
- Ключевое слово this в C#: разбор всех сценариев использования
- Абстрактные классы и методы в C#: практическое руководство
- Вложенные классы в C#: определение, использование и наследование
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Ключевое слово static в Java: переменные, методы и блоки — практические примеры
- Полиморфизм в C++: практическое руководство
- Абстракция данных в C++: разделение интерфейса и реализации