Laden...

Properties oder Eigenschaften im Konstruktor

Erstellt von crazyyzarc vor 5 Jahren Letzter Beitrag vor 5 Jahren 955 Views
C
crazyyzarc Themenstarter:in
8 Beiträge seit 2015
vor 5 Jahren
Properties oder Eigenschaften im Konstruktor

Hey alle miteinander,

ich habe ein Programm geschrieben, welches den Vor- und Nachnamen aus einer anderen Klasse zieht
Nun ist meine Frage, ob es besser ist im Mitarbeiter Konstruktor die private Eigenschaft (_Vorname) oder doch die public Propertie (Vorname) zu übergeben die wiederum auf die private Eigenschaft zugreift?! (wegen Sicherheit und so)

class Mitarbeiter
    {
        private string _Vorname = "Default";
        private string _Nachname = "Default";

        // Properties
        public string Vorname
        {
            get
            {
                return this._Vorname;
            }
            set
            {
                this._Vorname = value;
            }
        }

        public string Nachname
        {
            get
            {
                return this._Nachname;
            }
            set
            {
                this._Nachname = value;
            }
        }

        // Mitarbeiter Konstruktor
        public Mitarbeiter(string vorname, string nachname)
        {
            this._Vorname = vorname;
            this._Nachname = nachname;
        }

       
    }


// MAIN CLASS

class Program
    {
        static void Main(string[] args)
        {
            // Mitarbeiter Instanz
            Mitarbeiter m = new Mitarbeiter("DJ", "Bobo");

            m.Nachname = "Jackson";                         // Wert ändern
            Console.WriteLine(m.Vorname+ " " + m.Nachname);
            
            Console.ReadKey();
        }
    }

Futile place, futile program

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

ich würde generell die öffentlich zugreifbaren Properties verwenden.

Hat wenig mit wirklicher Sicherheit zu tun - sondern vielmehr damit, dass du somit dem Problem ausweichst später versehentlich die eigene Logik zu durchbrechen.

Stell dir mal vor im Setter eines der Properties passiert noch was anderes wie nur das setzen der internen Variable - das würdest du somit (wahrscheinlich versehentlich) übergehen.

LG

Beispiel:


class MyClass
        {
            private string _myVariable;

            public string MyVariable
            {
                get { return _myVariable; }
                set
                {
                    if (!string.IsNullOrWhiteSpace(value))
                        _myVariable = value;
                    else
                    _myVariable = myDefaultValueFromWherever;
                }
            }
        }

Wenn du hier dann auf deine private Variable zugreifst - wuselst du dich um deine eigene Schutzmaßnahme herum.

16.842 Beiträge seit 2008
vor 5 Jahren

Wenn Du Properties hast, dann arbeite immer mit diesen- egal ob es dahinter ein backing field gibt oder nicht.

Auf ein backing field sollte immer nur die Property zugreifen.

PS: Felder schreibt man klein, nicht _Nachname, sondern _nachname. ( [Artikel] C#: Richtlinien für die Namensvergabe )
PPS: Du kannst den Code folgendermaßen Vereinfachen - dank C# Syntaxzucker.

class Mitarbeiter
    {

        // Properties
        public string Vorname {get;set;} = "Default";
        public string Nachname {get;set;} = "Default";

       
        // Mitarbeiter Konstruktor
        public Mitarbeiter(string vorname, string nachname)
        {
            Vorname = vorname;
            Nachname = nachname;
        }
    }

Der Default macht aber nur wenig Sinn, weil Du ja kein Mitarbeiter-Objekt erstellen kannst, ohne Vorname und Nachname aktiv aufgrund des Konstruktors setzen zu müssen.

C
crazyyzarc Themenstarter:in
8 Beiträge seit 2015
vor 5 Jahren

Vielen Dank euch beiden ihr habt mir sehr geholfen!

und danke zusätzlich Abt für diese sehr vereinfachte Schreibweise

Futile place, futile program