Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Подсказка
Вы новичок в разработке программного обеспечения? Сначала начните с учебников для начинающих. Вы столкнетесь с классами после того, как вам нужно моделировать объекты с поведением и состоянием.
Есть опыт на другом языке? Классы C# похожи на классы в Java или C++. Просмотрите разделы инициализаторов объектов и инициализаторов коллекций на наличие характерных для C# паттернов, а также ознакомьтесь с записями как с вариантом, ориентированным на работу с данными.
Класс — это ссылочный тип, определяющий схему для объектов. При создании переменной типа класса переменная содержит ссылку на объект в управляемой куче. Переменная не хранит сами данные объекта. Назначение переменной класса другой переменной копирует ссылку, поэтому обе переменные указывают на один и тот же объект. Классы являются наиболее распространенным способом определения пользовательских типов в C#. Используйте их, если требуется сложное поведение, наследование или общая идентичность между ссылками.
Объявление класса
Определите класс с ключевым словом, class за которым следует имя типа. Необязательный модификатор доступа управляет видимостью. Значение по умолчанию :internal
public class Customer
{
public string Name { get; set; }
public Customer(string name) => Name = name;
}
Текст класса содержит поля, свойства, методы и события, коллективно называемые элементами класса. Имя должно быть допустимым именем идентификатора C#.
Создание объектов
Класс определяет тип, но он не является объектом. Вы создаете объект ( экземпляр класса) с ключевым словом new :
var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison
Переменная customer содержит ссылку на объект, а не сам объект. Можно назначить несколько переменных одному объекту. Изменения по одной ссылке отображаются через другую:
var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object
c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2
Это поведение совместного использования ссылок является одним из различий между классами и структурами, где назначение копирует данные. Более важно, классы поддерживают наследование. Вы можете создавать иерархии, в которых производные типы повторно используют и специализируются на поведении из базового класса. Структуры не могут участвовать в иерархиях наследования. Дополнительные сведения о различиях см. в разделе "Типы значений" и ссылочные типы.
Конструкторы и инициализация
При создании экземпляра вы хотите инициализировать его поля и свойства на полезные значения. C# предлагает несколько подходов: инициализаторы полей, параметры конструктора, первичные конструкторы и обязательные свойства.
Инициализаторы полей задают значение по умолчанию непосредственно в объявлении поля:
public class Container
{
private int _capacity = 10;
}
Инициализаторы полей определяют внутренние значения по умолчанию. Они не дают вызывающим абонентам никакого способа выбрать начальное значение. Чтобы разрешить потребителям класса предоставить значение, используйте один из следующих методов.
Параметры конструктора требуют, чтобы вызывающие пользователи предоставляли значения:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
Основные конструкторы (C# 12+) добавляют параметры непосредственно в объявление класса. Эти параметры доступны во всем тексте класса:
public class Container(int capacity)
{
private int _capacity = capacity;
}
Основные конструкторы и инициализаторы полей могут работать вместе: инициализатор _capacity = capacity полей использует в качестве значения параметр первичного конструктора. Этот шаблон позволяет зафиксировать аргументы конструктора в полях с помощью одного краткого определения.
Обязательные свойства применяются для задания определенных свойств вызывающими объектами с помощью инициализатора объектов:
public class Person
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper
Дополнительные сведения о шаблонах конструкторов, включая проверку параметров и цепочку конструкторов, см. в разделе "Конструкторы".
Статические классы
static класс не может быть создан и содержит только статические члены. Используйте статические классы для организации служебных методов, которые не работают с данными экземпляра:
static class MathHelpers
{
public static double CircleCircumference(double radius) =>
2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42
Библиотека классов .NET включает множество статических классов, таких как Math и Console. Статический класс неявно запечатан. Вы не можете унаследовать от него или создать экземпляр.
Инициализаторы объектов
Инициализаторы объектов позволяют задавать свойства при создании объекта без написания конструктора для каждого сочетания значений:
class ConnectionOptions
{
public string Host { get; init; } = "localhost";
public int Port { get; init; } = 80;
public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
Host = "db.example.com",
Port = 5432,
UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)
Инициализаторы объектов работают с любым доступным свойством, которое имеет set или init аксессор. Они объединяются естественным образом со required свойствами и конструкторами, которые принимают некоторые параметры, позволяя вызывающему объекту задавать другие.
Инициализаторы коллекций
Коллекция — это тип, содержащий группу связанных значений— списки, наборы, словари, массивы и диапазоны являются общими примерами. Библиотека классов .NET предоставляет такие типы коллекций общего назначения, как List<T>, Dictionary<TKey,TValue>и HashSet<T>, наряду с массивами и Span<T>.
Выражения коллекции (C# 12+) позволяют заполнять коллекцию на месте при ее создании с использованием синтаксиса скобок.
List<string> languages = ["C#", "F#", "Visual Basic"];
// The spread operator (..) composes collections from existing sequences:
List<string> moreLangs = [.. languages, "Python", "TypeScript"];
Console.WriteLine(string.Join(", ", moreLangs));
// C#, F#, Visual Basic, Python, TypeScript
Выражения коллекции работают с массивами, List<T>Span<T>и любым типом, поддерживающим инициализацию коллекции. Оператор распространения (..) добавляет все элементы из операнда в новую коллекцию. Операнд не обязательно должен быть полной коллекцией— это может быть любое выражение, которое создает последовательность, например, поддиапазон, запрос LINQ или отфильтрованное подмножество. Дополнительные сведения см. в разделе "Выражения коллекции" (справочник по C#).
Наследство
Классы поддерживают наследование. Можно определить новый класс, который повторно использует, расширяет или изменяет поведение существующего класса. Класс, от которого вы наследуете, называется базовым классом, а новый класс — производным классом.
var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering
Класс может наследовать от одного базового класса и реализовать несколько интерфейсов. Производные классы наследуют все члены базового класса, за исключением конструкторов. Дополнительные сведения см. в разделе "Наследование и интерфейсы".
Когда следует использовать классы
Используйте класс, когда:
- Тип имеет сложное поведение или управляет изменяемым состоянием.
- Необходимо наследование для создания базового класса с производными специализациями или создания производного типа, расширяющего существующий класс.
- Экземпляры представляют собой общую идентичность, а не просто набор данных (две ссылки на один и тот же объект должны оставаться синхронизированы).
- Тип обладает большим размером или длительным сроком существования и получает выгоду от выделения памяти на куче и ссылочной семантики.