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);
}
}
}
}