Статические поля и методы
Часть раздела Объектно-ориентированное программирование путешествия по 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 — это статическое поле.
Задание
ЛегкоДавайте создадим систему отслеживания заказов, которая использует статические члены для учета всех заказов, размещенных в вашем приложении.
Вы создадите два файла для организации вашего кода:
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}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов