Laden...

Instanzenfeldinitialisierer oder Standarderstellungsroutine?

Erstellt von 777 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.795 Views
7
777 Themenstarter:in
56 Beiträge seit 2007
vor 13 Jahren
Instanzenfeldinitialisierer oder Standarderstellungsroutine?

Ich denke das ist zwar eine Noobfrage, aber dennoch interessiert mich was der Defaultkonstruktor in C# bringt:

class fern
{
    int a;
    public fern()
    {
        a = 5;
    }
}

, wenn doch auch

class fern
{
   int a = 5;
}

funktioniert.

Soweit ich mich entsinnen kann ist der zweite Fall in C++ garnicht erlaubt gewesen?! Ich bin aber nicht mehr sicher.

Bis dann
777

Gelöschter Account
vor 13 Jahren

der Konstruktor ist nur für komplexeres geeignet. z.b. mehrzeilige anweisung und dann eine zuweisung einer klassenvariable. Wenn es sich wie in deinem Beispil ohnehin nur um einen Festen wert handelt, nimmt man keinen konstruktor.

7
777 Themenstarter:in
56 Beiträge seit 2007
vor 13 Jahren

Ah - verstehe. Dankeschön 😃

2.298 Beiträge seit 2010
vor 13 Jahren

Soweit ich mich entsinne (hab nun ein Jahr nicht mehr mit C++ gearbeitet) war es auch dort möglich bei Memberdefinition einen Wert mitzugeben.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

7
777 Themenstarter:in
56 Beiträge seit 2007
vor 13 Jahren

Das kann gut sein - ich weiß nur, dass unser Lehrer immer wollte, dass wir dort eine Standarderstellungsroutine verwenden um die werte zu definieren. Ich wusste somit garnicht, dass es überhaupt möglich ist die Instanzmember direkt zu initialisieren.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo 777,

es geht darum, dass Konstruktoren einen Sinn haben. Ein Konstruktor macht nichts anderes, als Variablen zu initialisieren oder Instanzen zu erzeugen. Programmiertechnisch gibt es keinen Unterschied. Das wäre bei dir jetzt so ein Fall, wo man sagen kann, dass man hierfür Konstruktoren verwenden sollte. Das ist auch üblich so.

Beachte bite auch [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

zero_x

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Programmiertechnisch gibt es keinen Unterschied. ist nicht ganz richtig.

Der Unterschied ist die Reihenfolge:
Wenn der Konstruktor aufgerufen wird, darf man davon ausgehen, daß Felder, die über Feldinitialisierer aufgerufen werden, bereits initialisiert sind, und kann diese somit sofort verwenden. Umgekehrt ist das nicht der Fall.
Außerdem können Feldinitialisierer ja auch nur verwendet werden, wenn relativ einfache Objekte erstellt werden. Man stösst da schnell an die Grenzen, wenn ein Objekt mit Hilfe eines zweiten Objekts (z.B. von außen) initialisiert werden soll, und dieses zweite Objekt nicht statisch ist, also ein schon vorhandenes Objekt benutzt wird -> dieses übergibt man dann in der Regel an den CTOR.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Gelöschter Account
vor 13 Jahren

Programmiertechnisch gibt es keinen Unterschied.

Das stimmt nicht ganz.

  1. haben Feldinitialisierer und Konstruktoren andere Performancezeiten
  2. ist die Reihenfolge des Aufrufens anders.

Siehe auch: C# and beforefieldinit

Das wäre bei dir jetzt so ein Fall, wo man sagen kann, dass man hierfür Konstruktoren verwenden sollte. Das ist auch üblich so.

nein. Weil in dem Beispiel das Feld erstmal mit 0 initialisiert wird und dann mit 5 überschrieben wird.

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo JAck30lena und MarsStein,

aus diesem Grund habe ich "keinen" auch kursiv geschrieben. Ein Anfänger wird das so nicht verstehen können. Ich habe versucht den Text "anfängergerecht" zu erklären, d.h. auch die "falschen" Aussagen von mir.

zero_x

Gelöschter Account
vor 13 Jahren

mag sein... allerdings ist es nicht wie von dir beschrieben "üblich" in so einem Fall den Konstruktor zu nehmen. Ganz im gegenteil.

Des weiteren bleibt eine falsche Aussage nun mal was es ist... -> falsch. Daher sollte man diese korrigieren. Unabhängig davon, ob der Fragesteller diese im Augenblick versteht oder nicht. Es ist nun mal so, das diese Antwort nicht nur vom Fragesteller gesehen wird, sondern auch von vielen anderen und auch über Google verfügbar gemacht wird.
Wenn nun jemand deine Antwort betrachtet und selbiges wissen wie z.B. MarsStein hat, ensteht ein schiefer Eindruck von der Qualität.