To jest stara wersja strony!


Typy wartościowe mają wersję typu umożliwiającą przypisanie wartości null.

Deklaracja:

 typ? nazwa = null;

Przykład:

int? a = null;
int? b = 42;
double? x = null;
bool? czy_prawda = null;
 
//int k = null; // ta deklaracja nie jest dozwolona

Typ wyliczeniowy to odmiana typu całkowitego, którego wartości mają przypisane nazwy (wyliczanka).

Deklaracja typu:

 enum nazwa_typu
 {
    element1, element2, ...
 };

Przykład:

enum Kolory { Czerwony , Niebieski , Zielony , Czarny } 
  • słowo enum definiuje nowy typ wyliczeniowy
  • deklaracja typu umieszczana jest w zakresie przestrzeni nazw lub klasy
  • lista elementów reprezentuje kolejne wartości całkowite od 0
internal class Program
{
    enum Kolory { Czerwony, Niebieski, Zielony, Czarny }
 
    static void Main(string[] args)
    {
        // deklaracja zmiennej
        Kolory kolor1;
 
        // przypisanie wartości
        kolor1 = Kolory.Czerwony;
 
        Console.WriteLine("Zmienna zawiera wartość {0}" , kolor1);
        Console.WriteLine("Wartość całkowita to {0}", (int)kolor1);
    }
}

Na zmiennych typu wyliczeniowego można wykonywać wszystkie operacje poprawne dla typu całkowitego.

enum Kolory { Czerwony, Niebieski, Zielony, Czarny }
 
static void Main(string[] args)
{
    Kolory kolor1 = Kolory.Zielony;
    kolor1++;     
    Console.WriteLine("Następny kolor to {0}", kolor1);
 
    for (var k = Kolory.Czerwony; k < Kolory.Czarny; k++)
    {
        Console.WriteLine($"Kolor: {k} o wartości {(int)k}");
    }
}

Wyjście

Następny kolor to Czarny
Kolor: Czerwony o wartości 0
Kolor: Niebieski o wartości 1
Kolor: Zielony o wartości 2
Kolor: Czarny o wartości 3

Wartościom wyliczeniowym możemy przypisać własne wartości liczbowe

enum Kolory
{
    Zielony = 5,
    Czerwony,
    Czarny = 10
}
 
static void Main(string[] args)
{
    for (var k = Kolory.Zielony; k <= Kolory.Czarny; k++)
    {
        Console.WriteLine($"Kolor: {k} o wartości {(int)k}");
    }
}

Wyjście

Kolor: Zielony o wartości 5
Kolor: Czerwony o wartości 6
Kolor: 7 o wartości 7
Kolor: 8 o wartości 8
Kolor: 9 o wartości 9
Kolor: Czarny o wartości 10
  • Struktura to typ wartościowy przechowujący elementy różnego typu.
  • pola - elementy struktury identyfikowane nazwami
  • ułatwiają organizację danych - struktura jest obiektem
  • struktura może być argumentem metody oraz typem zwracanym metody

Składnia

struct nazwa_typu 
{
   modyfikator_dostępu typ1 nazwa_pola1;
   modyfikator_dostępu typ2 nazwa_pola2;
   ...
};

Przykład:

struct Osoba
{
    public string Imię;
    public int Wiek;
}
Osoba student;
Osoba pracownik = new Osoba();

Dostęp do pól za pomocą kropki

student.imię = "Janek";
int x = pracownik.Wiek;
s.średnia = 5.0;
string s = s.nazwisko;
struct Osoba
{
    public string Imię;
    public int Wiek;
}
 
static void Main(string[] args)
{
    Osoba student;
 
    student.Imię = "Janek"; 
    student.Wiek = 33;
 
    Console.WriteLine(student.Imię);
    Console.WriteLine(student.Wiek);
}
  • struktury maja wiele podobnych mechanizmów jak klasy: konstruktory, meotody, właściwości, ..
  • struktury to typ wartościowy a klasy referencyjny
  • struktury nie wspierają dziedziczenia (ale to już inny temat)
Osoba student = new Osoba();
student.Imię = "Jan";
 
Osoba x = student;   // kopiowanie wartości
x.Imię = "Marek";
 
Console.WriteLine(student.Imię);
Console.WriteLine(x.Imię);

Wynik:

Jan
Marek

Ćwiczenie: baza danych

Zaimplementuj prostą bazę danych osobowych składającą się z sekwencji rekordów zawierających dane osobowe: imię, nazwisko i wiek osób umieszczonych w bazie danych. Struktury zawierające dane przechowuj w odpowiedniej tablicy. Dla uproszczenia zakładamy, że maksymalna ilość rekordów nie przekroczy 1000. Program po uruchomieniu wypisuje menu z możliwymi akcjami do wykonania po podaniu liczby od 1 do 5:

  wyswietl - wyświetlenie całej bazy danych
  dodaj - dodanie nowego rekordu do bazy danych
  usun - usunięcie rekordu z bazy danych wskazanego przez numer
  zamien - modyfikacja zawartości rekordu wskazanego przez numer
  zamknij - zamkniecie programu

Zaimplementuj wszystkie funkcjonalności opisane w powyższym menu. Zadbaj o obsługę sytuacji wyjątkowych, np. gdy podczas usuwania rekordu użytkownik poda niepoprawny numer. Po wykonaniu akcji 1, 2, 3 lub 4 menu ponownie jest wyświetlane i użytkownik ponownie może wykonać jedną z akcji. Wybranie pozycji nr 5 kończy działanie programu.