В объектно-ориентированном программировании на C# большинство членов класса (поля, свойства, методы) принадлежат конкретному экземпляру объекта. Однако иногда требуется работать с данными или функциональностью, которые относятся ко всему классу в целом, а не к отдельному объекту. Для этого используется ключевое слово static.
Статические члены существуют в единственном экземпляре на весь класс и доступны без создания объекта. Они играют важную роль при создании вспомогательных утилит, хранения общих данных и реализации паттернов проектирования. В этой статье мы подробно разберём статические поля, свойства, методы, конструкторы и статические классы.
Статические поля
Статическое поле принадлежит классу, а не отдельному объекту. Все экземпляры класса разделяют одно и то же значение этого поля.
public class Counter
{
public static int TotalCount = 0; // статическое поле
public Counter()
{
TotalCount++; // увеличивается при создании каждого объекта
}
}
// Использование
var c1 = new Counter();
var c2 = new Counter();
Console.WriteLine(Counter.TotalCount); // 2
Статические поля инициализируются один раз при первом обращении к классу.
Статические свойства
Статические свойства работают аналогично обычным, но принадлежат классу. Часто используются для доступа к статическим данным с контролем.
public class AppConfig
{
private static string _connectionString = "Server=localhost;";
public static string ConnectionString
{
get => _connectionString;
set => _connectionString = value;
}
}
// Использование
AppConfig.ConnectionString = "Server=prod;";
Console.WriteLine(AppConfig.ConnectionString);
Статические методы
Статические методы вызываются через имя класса и не имеют доступа к нестатическим членам экземпляра (нет ключевого слова this).
public class MathHelper
{
public static int Max(int a, int b)
{
return a > b ? a : b;
}
public static double Average(params double[] numbers)
{
return numbers.Average();
}
}
// Использование
int result = MathHelper.Max(10, 25);
double avg = MathHelper.Average(3.5, 7.2, 9.0);
Классический пример — класс Math в .NET (Math.Sqrt(), Math.PI и т.д.).
Статический конструктор
Статический конструктор вызывается автоматически один раз при первом обращении к классу. Он не может иметь параметров и модификаторов доступа.
public class Logger
{
public static string LogPath { get; private set; }
// Статический конструктор
static Logger()
{
LogPath = Path.Combine(Environment.CurrentDirectory, "logs.txt");
Console.WriteLine("Статический конструктор выполнен");
}
public static void Write(string message)
{
File.AppendAllText(LogPath, message + Environment.NewLine);
}
}
Статический конструктор удобен для инициализации статических данных.
Статический класс
Класс можно объявить полностью статическим с помощью модификатора static. В таком классе:
- Все члены должны быть статическими.
- Нельзя создавать экземпляры.
- Нельзя использовать наследование.
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
public static string ToTitleCase(string text)
{
// реализация
return text;
}
}
Статические классы идеально подходят для утилит и расширений (extension methods).
Важные особенности static
- Статические члены существуют на протяжении всего времени работы приложения.
- Они не поддерживают полиморфизм через наследование (нельзя переопределить статический метод через override).
- Статические поля могут создавать проблемы в многопоточных приложениях — требуется синхронизация.
- Статические члены нельзя использовать через this.
Модификатор static — важный инструмент ООП в C#, который позволяет создавать функциональность и данные на уровне класса.
Ключевые моменты:
- Статические поля и свойства хранят общие данные для всех объектов.
- Статические методы удобны для утилит и вспомогательных операций.
- Статический конструктор обеспечивает однократную инициализацию.
- Статический класс идеально подходит для набора связанных утилит.
Правильное использование статических членов делает код более структурированным и эффективным. Однако не стоит злоупотреблять ими — чрезмерное использование static может усложнить тестирование и нарушить принципы объектно-ориентированного проектирования.
0 Комментарий(я)
Зарегистрируйтесь чтобы оставить комментарий