W języku C# struktura to wartościowy typ danych. Konstrukcja taka pozwala przy pomocy jednej zmiennej przechowywać wiele różnych wartości. Słowo kluczowe struct pozwala na utworzenie struktury.

Struktury są używane do reprezentacji rekordów. Załóżmy, że chcemy śledzić książki w swojej biblioteczce. W strukturze możemy przechowywać atrybuty, które pozwalą nam jednoznacznie określić taką książkę:
  • Tytuł;
  • Autor;
  • Tematyka;
  • ID książki.

Definiowanie struktury

Aby zdefiniować strukturę należy posłużyć się słowem kluczowym struct. Struktura danych definiuje nowy typ danych z przynajmniej jednym atrybutem wewnątrz.
Przykład:
struct Ksiazka
{
    public string tytul;
    public string autor;
    public string tematyka;
    public int id_ksiazki;
}
Przykład programu z użyciem struktury:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Struktury
{
    class Program
    {
        struct Ksiazka
        {
            public string tytul;
            public string autor;
            public string tematyka;
            public int id_ksiazki;
        }
        static void Main(string[] args)
        {
            // Deklaracja książek typu "Ksiazka"
            Ksiazka ksiazka_1;
            Ksiazka ksiazka_2;
            // Specyfikacja pierwszej ksiazki
            ksiazka_1.tytul = "Programowanie w języku C#";
            ksiazka_1.autor = "Imię Nazwisko";
            ksiazka_1.tematyka = "Programowanie";
            ksiazka_1.id_ksiazki = 32;
            // Specyfikacja drugiej ksiazki
            ksiazka_2.tytul = "Wielka księga samochodów";
            ksiazka_2.autor = "Imię Nazwisko";
            ksiazka_2.tematyka = "Motoryzacja";
            ksiazka_2.id_ksiazki = 1;
            // Przykładowe wypisanie interesujących danych
            Console.WriteLine("Tytuł 1 ksiązki: {0}", ksiazka_1.tytul);
            Console.WriteLine("Tematyka 2 ksiązki: {0}", ksiazka_2.tematyka);
            Console.ReadKey();
        }
    }
}

Cechy struktur

W powyższym przykładzie zdefiniowaliśmy strukturę typu Ksiazka. Struktry w języku C# są zupełnie inne niż w C czy C++. W języku C# mają one następujące cechy:
  • struktrury mogą posiadać, metody, pola, indeksery, właściowości oraz zdarzenia;
  • struktura może mieć zdefiniowany konstruktor ale nie destruktor. Warto pamiętać, że nie można zdefiniować domyślnego konstruktora dla struktury. Konstruktor ten jest automatycznie zdefiniowany i nie może być zmieniony. Co to oznacza w praktyce? Oznacza to, iż można utworzyć konstruktor, który przyjmuje na starcie różne parametry;
  • struktury nie wspierają dziedziczenia z innych struktur czy klas;
  • struktury nie mogą zostać użyte jako baza dla innych struktur lub klas;
  • struktura może implementować jeden lub więcej interfejsów;
  • składowe struktury nie mogą być zdefinowane jako abstrakcyjne, wirtualne lub chronione;
  • kiedy tworzysz strukturę używając słowa kluczowego new tworzony jest oraz wywoływany domyślny konstruktor. W przeciwieństwie do klas, struktury mogą zostać zainicjowane bez słowa kluczowego new;
  • jeżeli nie zostanie użyte słowo kluczowe new pola struktury zostaną nieprzypisane a obiekt nie będzie mógł być używany dopóki pola nie zostaną zainicjowane.

Klasa vs struktura

Klasy i struktury mają następujące różnice:
  • klasy są typem referencyjnym a struktury typem wartościowym;
  • struktury nie wspierają dziedziczenia;
  • struktury nie mogą mieć domyślnego konstruktora.
Kolejny przykład
using System;
namespace Struktury
{
    class Program
    {
        static void Main(string[] args)
        {
            Samochody auto_1 = new Samochody();
            Samochody auto_2 = new Samochody();
            // specyfikacja pierwszego samochodu
            auto_1.PobierzWartosc("Audi", "RS6", 4200);
            // specyfikacja drugiego samochodu
            auto_2.PobierzWartosc("Ferrari", "F355", 3500);
            auto_1.WypiszWartosci();
            Console.WriteLine();
            auto_2.WypiszWartosci();
            Console.ReadKey();
            // Wynik działania programu
            //Marka: Audi
            //Model: RS6
            //Pojemnosc: 4200
            //Marka: Ferrari
            //Model: F355
            //Pojemnosc: 3500
        }
        struct Samochody
        {
            private string marka;
            private string model;
            private int pojemnosc;
            public void PobierzWartosc(string mar, string mod, int poj)
            {
                marka = mar;
                model = mod;
                pojemnosc = poj;
            }
            public void WypiszWartosci()
            {
                Console.WriteLine("Marka: {0}", marka);
                Console.WriteLine("Model: {0}", model);
                Console.WriteLine("Pojemnosc: {0}", pojemnosc);
            }
        }
    }
}