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;
  • struktrury zawierają pola, dostęp za pomocą kropki
  • pola domyślnie są publiczne
  • struktura może posiadać własne metody - ale o tym więcej na programowaniu obiektowym
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);
            }
        }
    }
}
struct student
{
int numer ;
char nazwisko [ 5 ] ;
} ;
struct student janek = { 1 3 , " ABC " } ;
struct student franek = { 5 , { ’A ’ , ’B ’ , ’C ’ } } 

Konstruktor to metoda struktury o takiej samej nazwie jak nazwa struktury. Służy do inicjowania wartości pól.

struct Student
{
int numer ;
char nazwisko [ 5 ] ;
 
public Student(int numer, string nazwisko)
{
   numer = numer;
   nazwisko = nazwisko;
}
} ;
 
Student janek = new Student(1, "Nowak");
kod tutaj

Ć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.