Использование структур (Руководство по программированию на C#)Using Structs (C# Programming Guide)

Тип struct подходит для представления простых объектов, таких как Point, Rectangleи Color.The struct type is suitable for representing lightweight objects such as Point, Rectangle, and Color. Хотя point удобно представить в виде класса с автоматически реализуемыми свойствами, в некоторых сценариях структура может оказаться более эффективной.Although it is just as convenient to represent a point as a class with Auto-Implemented Properties, a struct might be more efficient in some scenarios. Например, при объявлении массива из 1000 объектов Point потребуется выделить дополнительную память для ссылки на каждый объект. В этом случае использование структуры будет более экономичным вариантом.For example, if you declare an array of 1000 Point objects, you will allocate additional memory for referencing each object; in this case, a struct would be less expensive. Поскольку платформа .NET Framework содержит объект с именем Point, структура в этом примере называется "Coords".Because the .NET Framework contains an object called Point, the struct in this example is named "Coords" instead.

public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Определение конструктора по умолчанию (без параметров) для структуры является ошибочным.It is an error to define a default (parameterless) constructor for a struct. Кроме того, ошибкой будет и инициализация поля экземпляра в основной части структуры.It is also an error to initialize an instance field in a struct body. Члены структуры, доступные извне, можно инициализировать только с помощью параметризованного конструктора, неявного конструктора без параметров, инициализатора объекта или путем доступа к членам по отдельности после объявления структуры.You can initialize externally accessible struct members only by using a parameterized constructor, the implicit, parameterless constructor, an object initializer, or by accessing the members individually after the struct is declared. Любые закрытые или недоступные члены требуют исключительного использования конструкторов.Any private or otherwise inaccessible members require the use of constructors exclusively.

При создании объекта структуры с помощью оператора new вызывается соответствующий конструктор в соответствии с сигнатурой конструктора.When you create a struct object using the new operator, it gets created and the appropriate constructor is called according to the constructor's signature. В отличие от классов, создавать структуры можно без оператора new .Unlike classes, structs can be instantiated without using the new operator. В этом случае вызов конструктора не выполняется, что способствует более эффективному выделению ресурсов.In such a case, there is no constructor call, which makes the allocation more efficient. Однако поля остаются неназначенными и объект нельзя использовать до инициализации всех полей.However, the fields will remain unassigned and the object cannot be used until all of the fields are initialized. Например, невозможно получить или задать значения с помощью свойств.This includes the inability to get or set values through properties.

При создании экземпляра объекта структуры с помощью используемого по умолчанию конструктора без параметров все члены назначаются согласно их значениям по умолчанию.If you instantiate a struct object using the default, parameterless constructor, all members are assigned according to their default values.

При создании конструктора с параметрами для структуры необходимо явно инициализировать все члены. В противном случае один или несколько членов остаются неназначенными и такую структуру использовать невозможно: это вызывает ошибку компилятора CS0171.When writing a constructor with parameters for a struct, you must explicitly initialize all members; otherwise one or more members remain unassigned and the struct cannot be used, producing compiler error CS0171.

В отличие от классов, структуры не поддерживают наследование.There is no inheritance for structs as there is for classes. Структура не может наследовать от другой структуры или класса и не может быть базовой для класса.A struct cannot inherit from another struct or class, and it cannot be the base of a class. Однако структуры наследуют от базового класса Object.Structs, however, inherit from the base class Object. Структуры могут реализовывать интерфейсы именно так, как это делают классы.A struct can implement interfaces, and it does that exactly as classes do.

Нельзя объявить класс с помощью ключевого слова struct.You cannot declare a class using the keyword struct. В C# классы и структуры имеют разную семантику.In C#, classes and structs are semantically different. Структура является типом значения, а класс — ссылочным типом.A struct is a value type, while a class is a reference type. Дополнительные сведения см. в разделе Типы значений.For more information, see Value Types.

Если не требуется использовать семантику ссылочного типа, система может более эффективно обрабатывать небольшой класс, объявленный как структура.Unless you need reference-type semantics, a small class may be more efficiently handled by the system if you declare it as a struct instead.

Пример 1Example 1

ОПИСАНИЕDescription

В этом примере показана инициализация struct с использованием конструктора по умолчанию и параметризованного конструктора.This example demonstrates struct initialization using both default and parameterized constructors.

КодCode

public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare and initialize struct objects.
class TestCoords
{
    static void Main()
    {
        // Initialize.
        var coords1 = new Coords();
        var coords2 = new Coords(10, 10);

        // Display results.
        Console.Write("Coords 1: ");
        Console.WriteLine($"x = {coords1.x}, y = {coords1.y}");

        Console.Write("Coords 2: ");
        Console.WriteLine($"x = {coords2.x}, y = {coords2.y}");

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Coords 1: x = 0, y = 0
    Coords 2: x = 10, y = 10
*/

Пример 2Example 2

ОПИСАНИЕDescription

В этом примере демонстрируется уникальная возможность структур.This example demonstrates a feature that is unique to structs. Здесь создается объект CoOrds без использования оператора new.It creates a Coords object without using the new operator. Если заменить слово struct на слово class, программа не будет скомпилирована.If you replace the word struct with the word class, the program will not compile.

КодCode

public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare a struct object without "new".
class TestCoordsNoNew
{
    static void Main()
    {
        // Declare an object.
        Coords coords1;

        // Initialize.
        coords1.x = 10;
        coords1.y = 20;

        // Display results.
        Console.Write("Coords 1: ");
        Console.WriteLine($"x = {coords1.x}, y = {coords1.y}");

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: Coords 1: x = 10, y = 20

См. такжеSee also