Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Konstruktorredundanz in Ordnung?
Bunnychecker
myCSharp.de - Member



Dabei seit:
Beiträge: 224

Themenstarter:

Konstruktorredundanz in Ordnung?

beantworten | zitieren | melden

Guten Abend.

Ich habe verschiedene public Properties in meiner Klasse und lege diese im Konstruktor mit Standardwerten fest.

Wenn nun jemand eine Instanz meiner Klasse erzeugt und daraufhin eine spezielle Property auf einen bestimmten Wert setzen will, dann wird dabei im Konstruktor erst der Standardwert festgelegt und anschließend durch den Aufrufer nochmal ein bestimmter Wert festgelegt.

Meine Frage ist nun, ob diese redundanz in Ordnung ist, da ich durch verschiedene Konstruktorüberladungen niemals alle Möglichkeiten abdecken könnte.


// Class.cs
    public class Class
    {
        public int Property1{ get; set; }
        public string Property2{ get; set; }
        // [...]
        public string PropertyN{ get; set; }

        Klasse()
        {
                Property1 = 12;
                // [...]
        }


// Program.cs
    public class Program
    {    
        private static void Main()
        {
                Class c = new Class();
                c.Property1=5;
        }          
    }

LG
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1.346

beantworten | zitieren | melden

Benutze doch Defaultwerte in den parametern

// Class.cs
    public class Class
    {
        public int Property1{ get; set; }
        public string Property2{ get; set; }
        // [...]
        public string PropertyN{ get; set; }

        public Class(int property1 = 12, string property2 = "", ..., string propertyN = "")
        {
                Property1 = property1 ;
                // [...]
        }


    public class Program
    {
        private static void Main()
        {
                Class c = new Class(property1:5, propertyN:"Hallo");
        }
    }
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von pdelvo
Benutze doch Defaultwerte in den parametern
Oder Konstruktorüberladung:


public Class(int property1, string property2)
{
  //...
}
public Class()
   : this(12, "FooBar")
{
}

BTW: Die Verwendung der Default-Parameter würde ich auf null als Default-Wert begrenzen, also bezogen auf den Code von pdelvo:


public Class(int? property1 = null, string property2 = null, ..., string propertyN = null)
{
   Property1 = property1 ?? 12;
   Property2 = property2 ?? "";
   Property3 = propertyN ?? DefaultValue;
}
Hat dann auch den Vorteil, dass man explizit null übergeben kann, wenn man den Standardwert meint und die Defaultwerte nicht mehr bei Aufrufer fest einkompiliert werden.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Bunnychecker,

da es um (viele) öffentliche Properties geht und du ja wohl alle möglichen Kombinationen abdecken willst, wäre es ein Overkill für alle Kombinationen Konstruktoren anzubieten. Selbst wenn man mit Default-Parametern arbeitet. Wenn mehrere Properties denselben Typ haben - wie in deinem Beispiel - , geht es mit (normalen = unbekannten) Parameter sowieso nicht mehr, alle Kombinationen abzudecken. Das alles ist aber spätestens seit in C# die Initialisierungssyntax eingeführt wurde, gar nicht mehr nötig.

Damit kann man z.B. schreiben:

Class c = new Class () { Property2 = "bla", Property7 = "blub" };

herbivore
private Nachricht | Beiträge des Benutzers
Bunnychecker
myCSharp.de - Member



Dabei seit:
Beiträge: 224

Themenstarter:

beantworten | zitieren | melden

Ja, das stimmt, die Initialisierungssyntax hatte ich ganz vergessen, aber mir stellt sich dennoch die Frage, ob man da nicht doch eine gewisse redundanz zulassen sollte, denn wenn ich mir das so richtig überlege, dann habe ich einige int Variablen, die in 0,1% der Fälle mit 0 initialisiert werden sollten.

Ein Anwender, der also meine Klasse einfach verwenden möchte ohne sich groß Gedanken über den dahinterliegenden Code zu machen, der wird ein Objekt mit Standardkonstrukor erzeugen und wird dann evtl. auf Fehlermeldungen stoßen mit denen er nichts anfangen kann, eben weil entsprechende Eigenschaften mit 0 initialisiert worden ist.

Ich weiß nicht, ob das Sinn macht dieses Beispiel zu nennen, aber z.B. beim Timer ist das Intervall nach Instanziierung auch auf 100ms gesetzt.

MfG
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Bunnychecker am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Bunnychecker,

der Standard-Konstruktor sollte das Objekt natürlich in einen möglichst brauchbaren Zustand bringen. Also alle Member auf sinnvolle Werte initialisieren. Wenn er das nicht kann, weil es es bestimmte Muss-Werte gibt, die der Benutzer der Klasse vorgeben muss, spricht auch nichts dagegen, keinen Standard-Konstruktor zu definieren, sondern nur einen, der alle Muss-Werte als Parameter bekommt. Alle weiteren Variationen können dann weiterhin über die Initialisierungssyntax laufen.

herbivore
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Andere Moeglichkeit waeren optionale Parameter beim Konstruktor mit eventuellen Defaultwerten.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo weismat,

Defaultparameter wurden ja schon weiter oben genannt und angesprochen, ebenso wie ihre Grenzen.

herbivore
private Nachricht | Beiträge des Benutzers
Bunnychecker
myCSharp.de - Member



Dabei seit:
Beiträge: 224

Themenstarter:

beantworten | zitieren | melden

Meine aktuelle Klasse Browser implementiert neben üblichen HTTP Parametern wie UserAgent oder Referer auch andere Properties wie z.B. einen Timeout, die Anzahl der automatischen Weiterleitungen und viele andere Parameter, die man im Firefox z.B. über about:config abrufen könnte.

Einige Properties sind ja nicht weiter schlimm, wenn die mit 0 initialisiert werden, aber was bringt mir ein Browser dessen Timeout auf 0 gesetzt ist? Wenn ich nun 3-4 weitere Parameter habe (so wie ich das oben schon einmal erklärt habe), müsste ich nun doch für alle Properties Konstruktorüberladungen erstellen, die nicht mit 0 initialisiert werden dürfen, obwohl z.B. ein Timeout mit einem Standardwert von 60000ms in 99% der Fälle perfekt wäre? Ein möglichst brauchbarer Zustand wäre, wenn der Timeout diesen Wert hätte.

MfG
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Bunnychecker am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Bunnychecker,

ich habe ja schon geschrieben, wie du das hinbekommst.

herbivore
private Nachricht | Beiträge des Benutzers
Bunnychecker
myCSharp.de - Member



Dabei seit:
Beiträge: 224

Themenstarter:

beantworten | zitieren | melden

Übersehen...

Dank dir.
private Nachricht | Beiträge des Benutzers