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

Обновлен: Июль 2008

Тип struct подходит для создания несложных объектов, таких как Point, Rectangle и Color. Хотя точку удобно представить в виде класса с Автоматически реализуемыми свойствами, в некоторых сценариях структура может оказаться более эффективной. Например, при объявлении массива из 1000 объектов Point потребуется выделить дополнительную память для хранения ссылок на все эти объекты, и структура в таком случае будет более экономичным решением. Поскольку .NET Framework уже содержит объект с именем Point, структура в данном примере называется вместо этого "CoOrds".

public struct CoOrds
{
    public int x, y;

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

Определение конструктора по умолчанию (без параметров) для структуры является ошибкой. Ошибкой также является инициализация поля экземпляра в основной части структуры. Можно инициализировать члены структуры с помощью параметризованного конструктора или путем доступа к членам по отдельности после объявления структуры. Любые закрытые или в ином случае недоступные члены можно инициализировать только в конструкторе.

При создании объекта структуры с помощью оператора new объект создается и вызывается соответствующий конструктор. В отличие то классов структуры можно создавать без использования оператора new. В таком случае вызов конструктора отсутствует, что делает выделение более эффективным. Однако поля остаются без значений и объект нельзя использовать до инициализации всех полей.

Когда структура содержит ссылочный тип в качестве члена, конструктор по умолчанию члена должен вызываться явно, в противном случае член останется без значений и структура не сможет использоваться. (Это приведет к ошибке компилятора CS0171.)

В отличие от классов структуры не поддерживают наследование. Структура не может быть унаследованной от другой структуры или класса и не может быть основой для других классов. Однако структуры наследуют от базового класса Object. Структуры могут реализовывать интерфейсы; этот механизм полностью аналогичен реализации интерфейсов для классов.

В отличие от C++ класс нельзя объявить с помощью ключевого слова struct. В C# классы и структуры семантически различаются. Структура является типом значения, тогда как класс — это ссылочный тип. Дополнительные сведения см. в разделе Типы значений.

Если требуется использовать семантику ссылочных типов, небольшие классы могут обрабатываться системой более эффективно, чем структуры.

Пример 1

Описание

В этом примере демонстрируется инициализация struct с помощью конструктора по умолчанию и с помощью конструктора с параметрами.

Код

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:   
        CoOrds coords1 = new CoOrds();
        CoOrds coords2 = new CoOrds(10, 10);

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

        Console.Write("CoOrds 2: ");
        Console.WriteLine("x = {0}, y = {1}", coords2.x, 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
*/

Пример 2

Описание

В следующем примере демонстрируется уникальная возможность структур. В нем создается объект CoOrds без использования оператора new. Если заменить слово struct словом class, программа не будет скомпилирована.

Код

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 = {0}, y = {1}", coords1.x, 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

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Структуры (Руководство по программированию на C#)

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Добавлен абзац о CS0171

Исправление ошибки содержимого.