This article has been localized into Russian by the community.
Статические члены
Как мы видели в предыдущих главах, обычным способом взаимодействия с классом является создание нового экземпляра класса и работа с созданным объектом. Во многих случаях классы таковы, что можно создать множество копий класса и по-разному использовать их. Однако в некоторых случаях вы захотите использовать класс, не создавая его экземпляры или, по крайней мере, класс, в котором можно использовать его члены, не создавая объект.
Класс может быть статическим и иметь статические члены, как функции, так и поля. Статический класс не может быть создан, другими словами, он будет работать больше как группа связанных членов, чем фактический класс. Вместо этого можно создать нестатический класс, но разрешить ему иметь определенные статические члены. Нестатический класс по-прежнему можно создавать и использовать как обычный класс, но нельзя использовать статический член для объекта класса. Статический класс может содержать только статические члены.
Во-первых, вот пример статического класса:
public static class Rectangle
{
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Как видите, мы применили ключевое слово static для обозначения статического класса и использовали static повторно, обозначая тип метода CalculateArea. Если так не сделать, компилятор выдаст ошибку, потому что нельзя в статическом классе иметь не статический метод.
Чтобы применить этот метод, мы вызываем его прямо в классе, вот так:
Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));
Мы могли бы добавить другие полезные методы в класс Rectangle, но, возможно, вам интересно, почему мы передаем width и height фактическому методу, вместо того, чтобы хранить его внутри класса, а затем обратиться к ним оттуда, когда нужно? Потому что он статический! Мы могли бы хранить их, но только один вариант, потому что существует только одна версия статического класса. Это очень важно понимать.
Вместо этого мы можем сделать класс не статическим и тогда применить CalculateArea как служебную функцию этого класса:
public class Rectangle
{
private int width, height;
public Rectangle(int width, int height)
{
this.width = width;
this.height = height;
}
public void OutputArea()
{
Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
}
public static int CalculateArea(int width, int height)
{
return width * height;
}
}
Как видите, мы сделали класс не статическим. Мы также добавили конструктор, который принимает параметры width и height и присваивает их экземпляру. Тогда мы добавили метод OutputArea, применяющий статический метод для вычисления площади. Это хороший пример смешения статических и не статических методов в не статическом классе.
Обычное использование статических классов, хотя и осуждается некоторыми людьми, - это служебные / вспомогательные классы, где вы собираете кучу полезных методов, которые могут не принадлежать друг другу, но точно не подходят в другом месте.