none
new Klasse, wie ist der Ablauf RRS feed

  • Frage

  • Hallo Form,

    ich habe da mal eine allgemeinere Frage zum Ablauf wenn eine Klasse mit new instanziert wird. Was wird dann nacheinander ausgeführt. Kann es dabei sein (hatte ich mal vor langen gehört) das der Konstruktor zweimal durchlaufen wird ? Ich wolle mal etwas genauer wissen, was da abläuft 

    Nach new wird der Konstruktor aufgerufen, wann kommen dann die Properties. Ein weitere Frage ist, ob es eine gute Idee ist in einem Propertie eine Instant von einer Klasse zu machen. Nach dem Stil:

    public IClient Client {
           get { return new ClientTyp(); }
    }
    

    Gibt es zur Erstellung von Klassen Guidelines was, wie in einer Klasse gemacht werden sollte, also was guter Stil ist. Z.B. eine new in einem Propertie würde ich nicht machen, hatte ich aber schon mehrfach gesehen.

    oder auch:

    public class Foo {
       private test = new KlasseA();
       [...]
    }

    Danke und Gruß
    Gerhard Ahrens

    Mittwoch, 4. Februar 2015 07:42

Antworten

  • Hallo Gerhard,

    der Konstruktor wird bei new nur einmalig durchlaufen, und oben wird er jeweils beim Get ausgeführt.

    Man kann Instanzen durchaus in einer Eigenschaft erzeugen. Eine übliche Praxis ist z. B. eine verzögerte Erzeugung beim ersten Zugriff:

        private IClient _client;
        public IClient Client 
        {
           get 
           { 
                if (_client == null)
                    _client = new ClientTyp();
                return _client;
            }
        }

    Was man einsetzt, wenn eine Eigenschaft eher selten genutzt wird oder eine Klasse sehr viele Eigenschaften hat, der Zugriff auf die Eigenschaften aber variiert - oft bei Datenklassen.[1]

    Grundsätzliche Hinweise zum Entwurf findet man in den .NET Framework Design Guidelines zu Properties und auch Constructor Design.

    Gruß Elmar

    [1] Ein alternativer Ansatz wäre das Verwenden von Lazy<T>, siehe Verzögerte Initialisierung

    • Als Antwort markiert Gerhard Ahrens Donnerstag, 5. Februar 2015 07:19
    Mittwoch, 4. Februar 2015 08:21
    Beantworter
  • Hallo Gerhard,

    Grundsätzlich werden folgende Schritte durchlaufen:

    1. Initialisierung von statischen Variablen
    2. Statischer Konstruktor 
    3. Initialisierung von Instanz-Variablen
    4. Konstruktor
      - Verkettete(r) Konstruktor(en)
      - Aufgerufener Konstruktor

    Die Schritte 1 und 2 werden natürlich nur beim ersten Zugriff auf die Klasse durchlaufen

    Viele Güße,
    Stephan

    • Als Antwort markiert Gerhard Ahrens Donnerstag, 5. Februar 2015 07:19
    Mittwoch, 4. Februar 2015 08:47

Alle Antworten

  • Hallo Gerhard,

    der Konstruktor wird bei new nur einmalig durchlaufen, und oben wird er jeweils beim Get ausgeführt.

    Man kann Instanzen durchaus in einer Eigenschaft erzeugen. Eine übliche Praxis ist z. B. eine verzögerte Erzeugung beim ersten Zugriff:

        private IClient _client;
        public IClient Client 
        {
           get 
           { 
                if (_client == null)
                    _client = new ClientTyp();
                return _client;
            }
        }

    Was man einsetzt, wenn eine Eigenschaft eher selten genutzt wird oder eine Klasse sehr viele Eigenschaften hat, der Zugriff auf die Eigenschaften aber variiert - oft bei Datenklassen.[1]

    Grundsätzliche Hinweise zum Entwurf findet man in den .NET Framework Design Guidelines zu Properties und auch Constructor Design.

    Gruß Elmar

    [1] Ein alternativer Ansatz wäre das Verwenden von Lazy<T>, siehe Verzögerte Initialisierung

    • Als Antwort markiert Gerhard Ahrens Donnerstag, 5. Februar 2015 07:19
    Mittwoch, 4. Februar 2015 08:21
    Beantworter
  • Hallo Gerhard,

    Grundsätzlich werden folgende Schritte durchlaufen:

    1. Initialisierung von statischen Variablen
    2. Statischer Konstruktor 
    3. Initialisierung von Instanz-Variablen
    4. Konstruktor
      - Verkettete(r) Konstruktor(en)
      - Aufgerufener Konstruktor

    Die Schritte 1 und 2 werden natürlich nur beim ersten Zugriff auf die Klasse durchlaufen

    Viele Güße,
    Stephan

    • Als Antwort markiert Gerhard Ahrens Donnerstag, 5. Februar 2015 07:19
    Mittwoch, 4. Februar 2015 08:47
  • Hallo Zusammen,

    danke für die Infos, wieder was dazugelernt.

    Gruß
    Gerhard Ahrens

    Donnerstag, 5. Februar 2015 07:20