Laden...

Konstruktorredundanz in Ordnung?

Erstellt von Bunnychecker vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.289 Views
B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren
Konstruktorredundanz in Ordnung?

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

1.346 Beiträge seit 2008
vor 12 Jahren

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");
        }
    }

5.742 Beiträge seit 2007
vor 12 Jahren

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.

49.485 Beiträge seit 2005
vor 12 Jahren

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

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

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

49.485 Beiträge seit 2005
vor 12 Jahren

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

W
872 Beiträge seit 2005
vor 12 Jahren

Andere Moeglichkeit waeren optionale Parameter beim Konstruktor mit eventuellen Defaultwerten.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo weismat,

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

herbivore

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

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

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Bunnychecker,

ich habe ja schon geschrieben, wie du das hinbekommst.

herbivore

B
Bunnychecker Themenstarter:in
224 Beiträge seit 2009
vor 12 Jahren

Übersehen...

Dank dir.