Zacznijmy od tego czym jest konstruktor. Porównajmy klasę lub strukturę do technologi dzięki której maszyna (nasz program) wybija dla nas przedmiot z matrycy i nadaje mu kształt, dla uproszczenia niech to będzie prostopadłościan. Sama klasa to coś bardziej abstrakcyjnego, ona opisuje ten kształt polami danych, z czego on się składa. W naszym przypadku jest to długość, szerokość, wysokość. W ten sposób możemy opisać każdy prostopadłościan jaki istnieje. Ale my chcemy tworzyć konkretne egzemplarze, o konkretnych wymiarach i wiemy, że najczęściej tworzymy pewien rodzaj prostopadłościanu i to właśnie jego wymiary przypiszemy w konstruktorze domyślnym. A więc taki konstruktor można porównać do samej matrycy, która podczas tworzenia dla nas prostopadłościanu poprzez użycie słowa kluczowego new nadaje mu kształt domyślny. Możemy napisać kilka konstruktorów, które będą dla nas wykonywać odpowiednie operacje np. sprawdzać czy wprowadzana wartość jest większa od 0.

W klasie dla wszystkich pól ustawię modyfikator dostępu private, dzięki czemu ich wartości nie będą dostępne z poziomu obiektu. Dodatkowo utworzę metody, które będą nam zwracać wartości tych pól. Następnie dodamy odpowiednie konstruktory, dzięki nim nadamy wartości dla naszych pól. Modyfikatory dostępu opiszę w innym wpisie. Poprzez takie stworzenie klasy zablokowana zostanie możliwość zmiany wartości dla pól po stworzeniu obiektu.
Nasza klasa Prostopadłościan:

class Cuboid {
        private double height;
        private double width;
        private double length;
        private string name;
        public double GetHeight() {
            return height;
        }
       
        public double GetWidth() {
            return width;
        }
        public double GetLength() {
            return length;
        }
        public string GetName() {
            return name;
        }

Zacznijmy od stworzenia konstruktora domyślnego, który będzie przypisywał dla nas odpowiednie wartości do pól. Konstruktor jest zbliżony wyglądem do metody, lecz nigdy nie zwraca wartości nawet void. Nazwa konstruktora musi być zawsze taka sama jak nazwa klasy, zobaczmy przykład:

public Cuboid() {
      height = 10;
      width = 8;
      length = 6;
  }

Konstruktor domyślny jest zawsze tworzony za nas, więc nie musimy go tworzyć, w takim przypadku wszystkie zmienne liczbowe będą ustawione na wartość 0.

Zobaczmy przykład w kodzie klienta, skorzystamy tu z konstruktora domyślnego napisanego przez nas :

static void Main() {
            
     Cuboid przykladowy = new Cuboid();

            Console.WriteLine("Długość wynosi: " + przykladowy.GetLength());
            Console.WriteLine("Szerokość wynosi: " + przykladowy.GetWidth());
            Console.WriteLine("Wysokość wynosi: " + przykladowy.GetHeight());

            Console.ReadKey();        
        
        }

Zobaczymy następujące dane:

konstuktor1

Rys. Wyświetlenie stanu obiektu.

Gdy usuniemy konstruktor domyślny i pozwolimy kompilatorowi dodać go za nas otrzymamy następujące dane:

konstuktor2

Rys. Wyświetlenie stanu obiektu.

Jak widzimy do każdej zmiennej została przypisana wartość 0.
W przypadku gdy w konstruktorze domyślnym pominiemy jakąś zmienną i ją nie przypiszemy, zostanie ona ustawiona na wartość domyślną zobaczmy przykład:

public Cuboid() {
      height = 10;
      length = 6;
  }

Otrzymamy następujące dane:

konstuktor3

Rys. Wyświetlenie stanu obiektu.

Nie przypisaliśmy wartości dla zmiennej width i została ona ustawiona na 0.
W klasie bądź strukturze możemy zdefiniować nie standardowy konstruktor, czyli taki, który będzie posiadał parametry wejściowe.
Konstruktor ma zawsze identyczną nazwę jak klasa, kompilator rozróżnia konstruktory po ilości i typie parametru wejściowego zobaczmy przykład:

public Cuboid(double Height) {
      height = Height;
      
  }

W naszym przypadku nie możemy stworzyć następnego konstruktora z jednym parametrem double – kompilator zgłosi błąd:

konstuktor4

Rys. Błąd zgłoszony przez kompilator

Należy także pamiętać, że gdy chcemy używać konstruktorów z parametrami, musimy najpierw stworzyć konstruktor bezparametrowy czyli konstruktor domyślny nawet jeżeli w nim nic nie wpiszemy, w przeciwnym wypadku kompilator zgłosi błąd:

konstruktor5

Rys. Błąd zgłoszony przez kompilator

W naszym przypadku możemy stworzyć jeszcze dwa konstruktory zawierające parametry:

public Cuboid(double Height, double Width ) {
      height = Height;
      width = Width;
      
  }

  public Cuboid(double Height, double Width, double Length) {
            height = Height;
            width = Width;
            length = Length;
        } 

Dzięki wprowadzeniu konstruktora z trzema parametrami double możemy stworzyć każdy prostopadłościan. Konstruktor ten można przyrównać do uniwersalnej matrycy, którą możemy przed każdym wytłoczeniem ustawić.
Zobaczmy przykład:
Stwórzmy prostopadłościan o wymiarach: wysokość 10; szerokość 6; długość 8
Wystarczy, że w konstruktorze wpiszemy te parametry w następujący sposób:

Cuboid przykladowy = new Cuboid(10,6,8);

Otrzymamy następujący wynik naszych działań na konsoli:

konstruktor6

Rys. Wyświetlenie stanu naszego obiektu

Możemy stworzyć konstruktor prywatny zmieniając słowo kluczowe public na private. Taki konstruktor możemy wywołać jedynie z ciała klasy. Przez co gdy nie wywołamy konstruktora prywatnego w innym miejscu naszej klasy nie będzie można stworzyć obiektu tej klasy. Konstruktor prywatny wykorzystuje się w wzorcu projektowym singleton. Wzorzec ten opiszę w innym wpisie.