This article has been localized into Russian by the community.
Структуры
Структура C# является облегченной альтернативой классу. Он может делать почти то же самое, что и класс, но менее "дорого" использовать структуру, чем не класс. Причина этого немного техническая, но подводя итог, новые экземпляры класса помещаются в кучу, где вновь созданные структуры помещаются в стек. Кроме того, вы не имеете дело со ссылками на структуры, как с классами, а работаете непосредственно с экземпляром структуры. Это также означает, что при передаче структуры в функцию она является значением, а не ссылкой. Подробнее об этом в главе о параметрах функции.
Таким образом, структуры следует использовать, когда требуется представить более простые структуры данных, особенно если известно, что будет создано множество их экземпляров. Есть много примеров в .NET framework, где Microsoft использовала структуры вместо классов, например Point, Rectangle и Color struct.
Сначала я хотел бы показать вам пример использования структуры, а затем мы обсудим некоторые ограничения использования их вместо классов:
class Program
{
static void Main(string[] args)
{
Car car;
car = new Car("Blue");
Console.WriteLine(car.Describe());
car = new Car("Red");
Console.WriteLine(car.Describe());
Console.ReadKey();
}
}
struct Car
{
private string color;
public Car(string color)
{
this.color = color;
}
public string Describe()
{
return "This car is " + Color;
}
public string Color
{
get { return color; }
set { color = value; }
}
}
Наблюдательный читатель заметит, что это тот же самый пример кода, который используется во введении к классам, помимо изменения от класса к структуре. Это показывает, насколько схожи эти две концепции. Но чем они отличаются, кроме технических деталей, упомянутых в начале этой главы?
Прежде всего, поля не могут иметь инициализаторы, помня об этом, вы не можете объявить член как этот:
private string color = "Blue";
При объявлении конструктора всем полям должны быть присвоены значения перед выходом из конструктора. Структура имеет конструктор по умолчанию, но как только вы решите определить свой собственный, вы соглашаетесь инициализировать все поля в нем. Это также означает, что вы не можете объявить свой собственный конструктор без параметров - все конструкторы структур должны принимать хотя бы один параметр. В нашем примере выше мы фактически присвоили значение полю цвета. Если бы мы этого не сделали, компилятор бы пожаловался.
Структура не может наследовать от других классов или структур, а классы не могут наследовать от структур. Структура наследуется от класса Object, но только для наследования и структур. Однако они поддерживают интерфейсы, что означает, что ваши структуры могут реализовывать пользовательские интерфейсы.