C# Структура
В C# структура — это тип значения, используемый для организации и хранения связанных данных.
В C# структура — это структура данных типа значения, которая позволяет одной переменной хранить связанные данные различных типов данных.
structЭто ключевое слово используется для создания структуры.
Структура используется для представления записи. Предположим, вы хотите отслеживать статус книг в библиотеке; возможно, вы захотите отслеживать следующие атрибуты каждой книги:
- Title
- Автор
- Тема
- ID книги
Определение структуры
Чтобы определить структуру, необходимо использоватьstruct-оператор.
structЭтот оператор определяет новый тип данных с несколькими членами для программы.
Например, вы можете объявить структуру Book следующим образом:
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
Следующая программа демонстрирует использование структур:
Пример
using System.Text;
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1; /* Объявить Book1 типа Books */
Books Book2; /* Объявить Book2 типа Books */
/* детали книги 1 */
Book1.title = "Программирование на C";
Book1.author = "Nuha Ali";
Book1.subject = "Учебник по программированию на C";
Book1.book_id = 6495407;
/* сведения о книге 2 */
Book2.title = "Телеком-биллинг";
Book2.author = "Зара Али";
Book2.subject = "Учебник по телеком-биллингу";
Book2.book_id = 6495700;
/* Вывести информацию о Book1 */
Console.WriteLine( "Название книги 1 : {0}", Book1.title);
Console.WriteLine("Автор книги 1 : {0}", Book1.author);
Console.WriteLine("Тема книги 1 : {0}", Book1.subject);
Console.WriteLine("Идентификатор книги 1 :{0}", Book1.book_id);
/* Вывести информацию о Book2 */
Console.WriteLine("Book 2 title : {0}", Book2.title);
Console.WriteLine("Book 2 author : {0}", Book2.author);
Console.WriteLine("Book 2 subject : {0}", Book2.subject);
Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);
Console.ReadKey();
}
}
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Характеристики структур C#
Структура предоставляет облегченный тип данных, подходящий для представления простых структур данных, с хорошими характеристиками производительности и семантикой значений:
- Структура может иметь методы, поля, индексаторы, свойства, методы операторов и события, и подходит для представления легковесных данных, таких как координаты, диапазоны, даты, время и т. д.
- Структура может определять конструкторы, но не может определять деструкторы. Однако вы не можете определить конструктор без параметров для структуры. Конструктор без параметров (по умолчанию) определяется автоматически, и его нельзя изменить.
- В отличие от классов, структуры не могут наследоваться от других структур или классов.
- Структура не может использоваться в качестве базовой структуры для других структур или классов.
- Структуры могут реализовывать один или несколько интерфейсов.
- Члены структуры не могут быть объявлены как abstract, virtual или protected.
- Когда вы используетеNewКогда оператор `new` используется для создания объекта структуры, вызывается соответствующий конструктор для создания структуры. В отличие от классов, структуры можно создавать без использования оператора `new`.
- Если оператор New не используется, только после инициализации всех полей поля будут присвоены, и объект станет пригодным для использования.
- Переменные структур обычно размещаются в стеке, что делает их создание и уничтожение быстрее. Однако если структура используется как поле класса, а класс является ссылочным типом, структура будет храниться в куче.
- Структуры по умолчанию изменяемы, что означает, что вы можете изменять их поля. Однако если структура определена как readonly, её поля будут неизменяемыми.
Класс vs Структура
Классы и структуры имеют разные особенности при проектировании и использовании. Классы подходят для представления сложных объектов и поведения, поддерживая наследование и полиморфизм, тогда как структуры лучше подходят для представления легковесных данных и типов значений, чтобы повысить производительность и избежать накладных расходов на управление ссылками.
Классы и структуры имеют следующие основные различия:
Типы значений vs ссылочные типы:
- Структура — это тип значения (Value Type):Структуры являются типами значений. Они выделяют память в стеке, а не в куче. Когда экземпляр структуры передаётся в метод или присваивается другой переменной, копируется всё содержимое структуры.
- Класс — это ссылочный тип (Reference Type):Классы являются ссылочными типами. Они выделяют память в куче. Когда экземпляр класса передаётся в метод или присваивается другой переменной, фактически передаётся ссылка (адрес памяти), а не копия всего объекта.
Наследование и полиморфизм:
- Структуры не могут наследоваться:Структура не может наследоваться от других структур или классов, а также не может служить базовым классом для других структур или классов.
- Классы поддерживают наследование:Классы поддерживают наследование и полиморфизм и могут расширять функциональность существующих классов путём создания производных классов.
Конструктор по умолчанию:
- Структуры не могут иметь конструкторы без параметров:Структура не может содержать конструктор без параметров.
- Классы могут иметь конструкторы без параметров:Класс может содержать конструктор без параметров. Если конструктор не предоставлен, система предоставляет конструктор по умолчанию без параметров.
Поведение при присваивании:
- Когда переменной типа класса присваивается значение, она хранит ссылку, поэтому две переменные указывают на один и тот же объект.
- Когда переменной структуры присваивается значение, вся структура копируется, поэтому каждая переменная имеет собственную независимую копию.
Способ передачи:
- Объекты типа класса передаются по ссылке при вызове методов, то есть изменения, внесённые в объект внутри метода, влияют на исходный объект.
- Объекты структур обычно передаются по значению, то есть передаётся копия структуры, а не сам исходный объект структуры. Поэтому изменения, внесённые в структуру внутри метода, не влияют на исходный объект.
Допустимость null:
- Структура — это тип значения, и её нельзя напрямую задать равнойnull:, потому чтоnull— это значение по умолчанию ссылочного типа, а не значение по умолчанию типа значения. Если нужно представить отсутствующее или недопустимое состояние переменной структуры, можно использоватьNullable<T>или, как их называют,T?nullable-типы.
- Классы по умолчанию могут быть null:Экземпляры классов по умолчанию могут быть
null, потому что они являются ссылочными типами.
Производительность и выделение памяти:
- Структуры обычно более легковесны:Поскольку структуры являются типами значений и выделяют память в стеке, они, как правило, легче классов и подходят для простого представления данных.
- Классы могут иметь больше накладных расходов:Поскольку классы являются ссылочными типами, они могут требовать больше накладных расходов на память и управление.
В следующем примере MyStruct — это структура, а MyClass — это класс.
Закомментированный раздел показывает, что структуры не могут содержать конструкторы без параметров, не могут наследоваться, а копирование экземпляра структуры копирует всё содержимое структуры. В отличие от них, классы могут содержать конструкторы без параметров, могут наследоваться, а при копировании экземпляра копируется ссылка.
Пример
// Объявление структуры
struct MyStruct
{
public int X;
public int Y;
// Структуры не могут иметь конструкторы без параметров
// public MyStruct()
// {
// }
// Параметризованный конструктор
public MyStruct(int x, int y)
{
X = x;
Y = y;
}
// Структура не может наследовать
// struct MyDerivedStruct : MyBaseStruct
// {
// }
}
// Объявление класса
class MyClass
{
public int X;
public int Y;
// Класс может иметь конструктор без параметров
public MyClass()
{
}
// Параметризованный конструктор
public MyClass(int x, int y)
{
X = x;
Y = y;
}
// Классы поддерживают наследование
// class MyDerivedClass : MyBaseClass
// {
// }
}
class Program
{
static void Main()
{
// Структуры — это типы значений, размещаемые в стеке
MyStruct structInstance1 = new MyStruct(1, 2);
MyStruct structInstance2 = structInstance1; // Копирование всей структуры
// Классы — ссылочные типы, размещаемые в куче
MyClass classInstance1 = new MyClass(3, 4);
MyClass classInstance2 = classInstance1; // Копирование ссылки, указывающей на тот же объект
// Изменение экземпляра структуры не влияет на другие экземпляры
structInstance1.X = 5;
Console.WriteLine($"Структура: {structInstance1.X}, {structInstance2.X}");
// Изменение экземпляра класса повлияет на другие экземпляры
classInstance1.X = 6;
Console.WriteLine($"Класс: {classInstance1.X}, {classInstance2.X}");
}
}
Исходя из вышесказанного, перепишем предыдущий пример:
Пример
using System.Text;
struct Books
{
private string title;
private string author;
private string subject;
private int book_id;
public void setValues(string t, string a, string s, int id)
{
title = t;
author = a;
subject = s;
book_id =id;
}
public void display()
{
Console.WriteLine("Название : {0}", title);
Console.WriteLine("Автор : {0}", author);
Console.WriteLine("Тема : {0}", subject);
Console.WriteLine("Book_id :{0}", book_id);
}
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1 = new Books(); /* Объявить Book1 типа Books */
Books Book2 = new Books(); /* Объявить Book2 типа Books */
/* детали книги 1 */
Book1.setValues("C Programming",
"Nuha Ali", "C Programming Tutorial",6495407);
/* сведения о книге 2 */
Book2.setValues("Telecom Billing",
"Zara Ali", "Telecom Billing Tutorial", 6495700);
/* Вывести информацию о Book1 */
Book1.display();
/* Вывести информацию о Book2 */
Book2.display();
Console.ReadKey();
}
}
Когда приведённый выше код компилируется и выполняется, он выдаёт следующий результат:
Title : C Programming Author : Nuha Ali Subject : C Programming Tutorial Book_id : 6495407 Title : Telecom Billing Author : Zara Ali Subject : Telecom Billing Tutorial Book_id : 6495700Другие расширения