Properties

Wenn Daten in einer Klasse gespeichert werden sollen, können in C# Felder oder Properties verwendet werden.

Felder

Dir sollten Felder bereits bekannt sein, :

namespace DateiverwaltungPro.Views {
    public class MainWindowViewModel {
        public int ButtonClicksAmount;
    }
}

In diesem Beispiel ist ButtonClicksAmount public, d.h. von überall her kann darauf zugegriffen werden. Wenn wir nun bestimmte Einschränkungen vorgeben möchten, müssen wir das Feld als private definieren und einen Getter und einen Setter schreiben.

Um diesen Kurs etwas interessanter zu gestalten werde ich ab sofort möglichst viele Aufgaben integrieren.

Aufgabe 1

Ändere die Sichtbarkeit der ButtonClicksAmount-Variable auf private und erstelle einen Getter und einen Setter. Folgende Bedingungen sollen eingehalten werden:

  • Die Variable soll keine negativen Werte zugewiesen bekommen.
  • Wenn der Wert größer als 1000 ist, soll 1000 zurückgegeben werden.
Lösung Aufgabe 1:
namespace DateiverwaltungPro.Views {
    public class MainWindowViewModel {
        private int _buttonClicksAmount;


        public int GetButtonClicksAmount() {
            if(_buttonClicksAmount > 1000) {
                return 1000;
            }
            return _buttonClicksAmount;
        }


        public void SetButtonClicksAmount(int newAmount) {
            if(newAmount < 0) {
                newAmount = 0;
            }
            _buttonClicksAmount = newAmount;
        }
    }
}

Private Felder werden i.d.R. beginnend mit einem Unterstrich und einem Kleinbuchstaben geschrieben. Parameter und andere lokale Variablen werden klein geschrieben.

Da in WPF relativ oft Logik im Getter oder Setter benötigt wird, hat man nur selten Felder, welche keinen Getter oder Setter benötigen. Um den Code trotzdem möglichst kompakt und übersichtlich zu halten, wurden Properties entwickelt.

Properties

Das Äquivalent zum Feld public int ButtonClicksAmount; lässt sich auf zwei Arten schreiben:

// Die kompakte Version
public int ButtonClicksAmount{ get; set; }
// Mit einem so gennanten 'backing field'
private int _buttonClicksAmount;

public int ButtonClicksAmount {
    get {
        return _buttonClicksAmount;
    }
    set {
        _buttonClicksAmount = value;
    }
}

Die ausführliche Version wird benötigt, um Logik im Getter oder Setter unterzubringen. Die Syntax um auf den Wert zuzugreifen ist gleich wie bei einem Feld:

ButtonClicksAmount = 42;

Aufgabe 2

Ändere deinen Code so um, dass alles von Aufgabe 1 mit einer Property umgesetzt ist.

Lösung Aufgabe 2:
namespace DateiverwaltungPro.Views {
    public class MainWindowViewModel {
        private int _buttonClicksAmount;

        public int ButtonClicksAmount {
            get {
                if(_buttonClicksAmount > 1000) {
                    return 1000;
                }
                return _buttonClicksAmount;
            }
            set {
                if(value < 0) {
                    value = 0;
                }
                _buttonClicksAmount = value;
            }
        }
    }
}

Jetzt muss nicht mehr umständlich ein Getter oder Setter aufgerufen werden.

Kommentieren Kommentare