Menu
Coddy logo textTech

Статические поля и методы

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 12 из 70.

До сих пор каждое поле и метод, которые мы создавали, принадлежали отдельным объектам. Но иногда вам нужны данные или поведение, которые принадлежат самому классу и являются общими для всех экземпляров. Именно здесь на помощь приходит ключевое слово static.

Статическое поле является общим для всех объектов класса. Существует только одна копия, независимо от того, сколько экземпляров вы создадите:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

Каждый раз, когда создается новый Player, TotalPlayers увеличивается. У всех игроков общий счетчик.

Статический метод принадлежит классу и может быть вызван без создания объекта:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Вызывается для класса, а не для экземпляра
int result = Calculator.Add(5, 3);

Обратите внимание, что доступ к статическим членам осуществляется с использованием имени класса, а не ссылки на объект. Статические методы не могут обращаться к полям экземпляра или использовать this, так как они не принадлежат какому-либо конкретному объекту.

Вы уже использовали статические члены, даже не осознавая этого. Console.WriteLine() — это статический метод, а Math.PI — это статическое поле.

challenge icon

Задание

Легко

Давайте создадим систему отслеживания заказов, которая использует статические члены для учета всех заказов, размещенных в вашем приложении.

Вы создадите два файла для организации вашего кода:

  • Order.cs: Определите класс Order в пространстве имен OrderSystem. Каждый заказ должен иметь свойства экземпляра OrderId (int) и CustomerName (string). Класс также должен отслеживать общее количество созданных заказов с помощью статического поля TotalOrders и предоставлять статический метод GetNextOrderId(), который возвращает следующий доступный идентификатор заказа (начиная с 1). Конструктор должен принимать имя клиента, автоматически назначать идентификатор заказа с помощью статического метода и увеличивать общее количество заказов.
  • Program.cs: В основном файле создайте заказы на основе входных данных и выведите их детали вместе с общим количеством заказов.

Вы получите два входных значения, представляющих имена клиентов для двух отдельных заказов.

Для каждого заказа выведите его детали в следующем формате:

Order #{OrderId} - Customer: {CustomerName}

После создания обоих заказов выведите общее количество:

Total Orders: {TotalOrders}

Например, если входные данные — Alice и Bob, вывод должен быть следующим:

Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2

Шпаргалка

Ключевое слово static создает члены, которые принадлежат самому классу, а не отдельным экземплярам.

Статические поля являются общими для всех объектов класса. Существует только одна копия, независимо от того, сколько экземпляров создано:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

Статические методы принадлежат классу и могут быть вызваны без создания объекта:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Called on the class, not an instance
int result = Calculator.Add(5, 3);

Доступ к статическим членам осуществляется с использованием имени класса, а не ссылки на объект. Статические методы не могут обращаться к полям экземпляра или использовать this, так как они не принадлежат какому-либо конкретному объекту.

Общие примеры статических членов включают Console.WriteLine() (статический метод) и Math.PI (статическое поле).

Попробуйте сами

using System;
using OrderSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Считать имена клиентов
        string customer1 = Console.ReadLine();
        string customer2 = Console.ReadLine();

        // TODO: Создать два объекта Order с именами клиентов

        // TODO: Вывести сведения о каждом заказе в формате:
        // Order #{OrderId} - Customer: {CustomerName}

        // TODO: Вывести общее количество заказов в формате:
        // Total Orders: {TotalOrders}
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование