Понимание структур в C#: определение, использование и ключевые отличия
Структуры в C#
Научитесь определять, создавать экземпляры и работать со структурами в C#, включая конструкторы, свойства и их ключевые отличия от классов.
В C# структура (struct) работает похоже на класс, но является типом значения, то есть хранит данные напрямую, а не ссылку.
Предположим, мы хотим хранить имя и возраст человека. Можно создать две переменные: name и age и сохранить значения.
Однако, если нужно хранить эту информацию для нескольких людей, объявление отдельных переменных становится утомительным. Определение структуры, содержащей name и age, позволяет повторно использовать ту же компоновку для каждого человека.
Определение структуры в C#
В C# используется ключевое слово struct для объявления структуры. Например:
struct Employee {
public int id;
}
Здесь id — это поле внутри структуры. Структура может также содержать методы, индексаторы и многое другое.
Объявление переменной структуры
Прежде чем использовать структуру, нужно создать переменную структуры. Синтаксис:
struct Employee {
public int id;
}
// объявление emp типа struct Employee
Employee emp;
В примере мы определили структуру Employee и объявили переменную emp этого типа.
Доступ к членам структуры в C#
Доступ к членам структуры осуществляется через оператор точки (.):
Employee emp;
emp.id = 1;
Это присваивает значение 1 полю id структуры Employee.
Примечание: примитивные типы, такие как int, bool и float, являются предопределенными структурами в C#.
Пример: структура в C#
using System;
namespace CsharpStruct {
// определение структуры
struct Employee {
public int id;
public void getId(int id) {
Console.WriteLine("ID сотрудника: " + id);
}
}
class Program {
static void Main(string[] args) {
// объявление emp типа struct Employee
Employee emp;
// доступ и установка поля структуры
emp.id = 1;
// доступ к методам структуры
emp.getId(emp.id);
Console.ReadLine();
}
}
}
Результат
ID сотрудника: 1
Программа создает структуру Employee, устанавливает её поле id и вызывает метод getId для отображения.
Структуру также можно создать с ключевым словом new:
Employee emp = new Employee();
Это вызывает конструктор без параметров и инициализирует все поля значениями по умолчанию.
Конструкторы в структурах C#
Структуры могут определять конструкторы для инициализации полей. Пример:
struct Employee {
public int id;
// конструктор
public Employee(int employeeId) {
id = employeeId;
}
}
Примечание: до C# 10 структуры не могли содержать конструкторы без параметров.
Пример: конструктор в структурах C#
using System;
namespace CsharpStruct {
// определение структуры
struct Employee {
public int id;
public string name;
// параметризованный конструктор
public Employee(int employeeId, string employeeName) {
id = employeeId;
name = employeeName;
}
}
class Program {
static void Main(string[] args) {
// вызов конструктора структуры
Employee emp = new Employee(1, "Brian");
Console.WriteLine("Имя сотрудника: " + emp.name);
Console.WriteLine("ID сотрудника: " + emp.id);
Console.ReadLine();
}
}
}
Результат
Имя сотрудника: Brian ID сотрудника: 1
В этом примере конструктор присваивает значения всем полям. Неинициализация каждого поля приводит к ошибке компиляции.
Свойства в структурах C#
Структуры могут предоставлять свойства для инкапсуляции. Пример:
using System;
namespace CsharpStruct {
// определение структуры
struct Employee {
public int id;
// создание свойства
public int Id {
get { return id; }
set { id = value; }
}
}
class Program {
static void Main(string[] args) {
Employee emp = new Employee();
emp.Id = 1;
Console.WriteLine("ID сотрудника: " + emp.Id);
Console.ReadLine();
}
}
}
Результат
ID сотрудника: 1
Здесь свойство Id обеспечивает контролируемый доступ к полю id.
Разница между классом и структурой в C#
Хотя классы и структуры имеют похожий синтаксис, они принципиально отличаются:
- Класс — ссылочный тип; структура — тип значения.
- Присваивание экземпляра класса копирует ссылку, поэтому две переменные указывают на один объект. Присваивание структуры копирует всё значение.
- Структуры не поддерживают наследование, тогда как классы поддерживают.
Пример поведения класса (ссылка):
using System;
namespace CsharpStruct {
class Employee {
public string name;
}
class Program {
static void Main(string[] args) {
Employee emp1 = new Employee();
emp1.name = "John";
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Имя Employee1: " + emp1.name);
Console.ReadLine();
}
}
}
Результат
Имя Employee1: Ed
Пример поведения структуры (значение):
using System;
namespace CsharpStruct {
struct Employee {
public string name;
}
class Program {
static void Main(string[] args) {
Employee emp1 = new Employee();
emp1.name = "John";
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Имя Employee1: " + emp1.name);
Console.ReadLine();
}
}
}
Результат
Имя Employee1: John
В примере со структурой emp2 получает копию emp1, поэтому изменения emp2 не влияют на emp1.
Эти отличия делают структуры идеальными для небольших, неизменяемых структур данных, которые получают выгоду от размещения в стеке и семантики значений.
Язык C
- Освоение структур в C: определение, переменные, доступ и продвинутые примеры
- Освоение структур и указателей в C: практическое руководство
- Освоение структур в C: передача, возврат и работа по ссылке
- Оставайтесь впереди в будущем работы: стратегии преодоления конкуренции
- Структуры (struct) в C++: объяснение с практическим примером
- Аргументы за модернизацию графиков сотрудников для удержания талантов и продуктивности
- Повышение безопасности на рабочем месте: почему регулярные повторные проверки сотрудников важны
- 4 проверенные стратегии усиления вовлеченности сотрудников в условиях COVID-19
- DVIRC: Алан Шелл повышен до директора по Lean/CI, три новых сотрудника в команде
- Аналитика производительности сотрудников: раскрытие инсайтов в эпоху IoT