English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В C# struct является типом данных значения, представляющим структуру данных. Он может содержать параметризованный конструктор, статический конструктор, константы, поля, методы, свойства, индексаторы, операторы, события и вложенные типы.
Структура может использоваться для хранения небольших данных, не требующих наследования, таких как точки координат, пары ключ-значение и сложные данные структуры.
Структуру можно声明 с использованием ключевого слова struct. По умолчанию модификатор - это внутренний модификатор структуры и ее членов.
В следующем примере объявлена структура координатной карты.
struct Coordinate { public int x; public int y; }
Как и переменные базовых типов, объекты struct можно создавать с использованием или без использования оператора new.
struct Coordinate { public int x; public int y; } Coordinate point = new Coordinate(); Console.WriteLine(point.x); // Вывод: 0 Console.WriteLine(point.y); // Вывод: 0
Верхний пример создания объекта структуры Coordinate (координата) с использованием ключевого слова new. Он вызывает默认ный безпараметрический конструктор структуры, который инициализирует все члены значениями по умолчанию для их типов.
Если переменная типа struct объявлена без использования ключевого слова new, то она не вызывает ни одного конструктора, поэтому все члены остаются не заданными. Поэтому перед доступом к каждому члену им необходимо分配 значение, в противном случае будет выведена ошибка компиляции.
struct Coordinate { public int x; public int y; } Coordinate point; Console.Write(point.x); // Ошибка компиляции point.x = 10; point.y = 20; Console.Write(point.x); // Вывод: 10 Console.Write(point.y); // Вывод: 20
Структура (структура) не может включать конструктор без параметров. Она может включать только параметризованный конструктор или статический конструктор.
struct Coordinate { public int x; public int y; public Coordinate(int x, int y) { this.x = x; this.y = y; } } Coordinate point = new Coordinate(10, 20); Console.WriteLine(point.x); // Вывод: 10 Console.WriteLine(point.y); // Вывод: 20
Все члены структуры должны быть включены в параметризованный конструктор и распределены среди членов; в противном случае, если любой член останется не распределенным, компилятор C# выдаст ошибку компиляции.
Структура (структура) может включать свойства, автоматически реализованные свойства, методы и т.д., как и класс.
struct Coordinate { public int x { get; set; } public int y { get; set; } public void SetOrigin() { this.x = 0; this.y = 0; } } Coordinate point = Coordinate(); point.SetOrigin(); Console.WriteLine(point.x); // Вывод: 0 Console.WriteLine(point.y); // Вывод: 0
Ниже приведен пример структуры, включающей статические методы.
struct Coordinate { public int x; public int y; public Coordinate(int x, int y) { this.x = x; this.y = y; } public static Coordinate GetOrigin() { return new Coordinate(); } } Coordinate point = Coordinate.GetOrigin(); Console.WriteLine(point.x); // Вывод: 0 Console.WriteLine(point.y); // Вывод: 0
Структуры могут содержать уведомления для подписчиков о некоторых операциях. В следующей структуре (struct) содержится событие.
struct Coordinate { private int _x, _y; public int x { get{ return _x; } set{ _x = value; CoordinatesChanged(_x); } } public int y { get{ return _y; } set{ _y = value; CoordinatesChanged(_y); } } public event Action<int> CoordinatesChanged; }
Приведенная выше структура содержит событие coordinateChanged, которое вызывается при изменении координат x или y. В следующем примере показано, как обрабатывать событие CoordinateChanged.
class Program { static void Main(string[] args) { Coordinate point = new Coordinate(); point.CoordinatesChanged += StructEventHandler; point.x = 10; point.y = 20; } static void StructEventHandler(int point) { Console.WriteLine("Координаты изменены на {0}", point); } }
Структура является типом значений, поэтому она быстрее, чем объект класса. Когда вам нужно только хранить данные, используйте структуру. Обычно, структуры подходят для игрового программирования. Однако, передача объектов класса происходит легче, чем передача структур. Поэтому, когда вы передаете данные через сеть или другие классы, не используйте структуру.
Структура может включать конструкторы, константы, поля, методы, свойства, индексаторы, операторы, события и внутренние типы.
Структура не может содержать конструктор без параметров или деструктор.
Структура может реализовать интерфейсы, такие как классы.
Структура не может наследовать другую структуру или класс, а также не может быть базовым классом для класса.
Структура не может определить член как абстрактный, заключенный, виртуальный или защищенный член.