Forum: PC-Programmierung Was ist ein Konstruktor-VisualC# 2010-Galileo Computing


von Klaus P. (Gast)


Lesenswert?

"Häufig werden die Werte gekapselter Felder von schreibgeschützten 
Eigenschaften bei der Initialisierung des Objekts im Konstruktor 
festgelegt."
1
//Felder**********************************************
2
        private int _XKoordinate = 0;
3
        private int _YKoordinate = 0;
4
        private double _Radius = 0;
5
        private double _nurLesbar = 664.56;
6
7
        //Eigenschaften der Felder****************************
8
        public int XKoordinate
9
        {
10
            get { return _XKoordinate; }
11
            set { _XKoordinate = value; }
12
        }
13
        public int YKoordinate
14
        {
15
            get { return _YKoordinate; }
16
            set { _YKoordinate = value; }
17
        }
18
        public double Radius
19
        {
20
            get { return _Radius; }
21
            set
22
            {
23
                if (value >= 0)
24
                    _Radius = value;
25
                else
26
                    Console.WriteLine("Radius darf nicht negativ sein!");
27
            }
28
        }
29
        public double nurLesbar
30
        {
31
            get { return _nurLesbar; }
32
        }

Sind in diesem Absatz diese Variablen
1
        private int _XKoordinate = 0;
2
        private int _YKoordinate = 0;
3
        private double _Radius = 0;
4
        private double _nurLesbar = 664.56;

als Konstruktor gemeint?

Gibt es auch andere Definitionen von Konstruktor in Visual C# oder ist 
das immer die "Zusatz-Variable" welche benötigt wird um bestimmte 
Rechte/Regeln an Objekte bzw. Eigenschaften der Klasse zu definieren?

von bluppdidupp (Gast)


Lesenswert?

1
public class EineKlasse
2
{
3
     private int einInt=0; // *1*
4
     private string einString="bla";
5
6
     // Konstruktur
7
     // Funktion die genauso heisst wie die Klasse selbst
8
     // hat keinen Rückgabewert
9
     // Hier werden normalerweise Zeugs wie einInt, einString initialisiert
10
     public EineKlasse()
11
     {
12
         this.einInt=12; // *2*
13
         this.einString="blapp";
14
     }
15
 
16
     public int addiere(int a, int b)
17
     {
18
         return a+b;
19
     }
20
}
...der Konstruktur ist einfach eine spezielle Funktion, die aufgerufen 
wird wenn das Objekt erzeugt wird.

Zu beachten ist das die Zuweisung einInt=0 vor dem Aufruf des 
Konstruktors passiert. Nach EineKlasse k=new EineKlasse(); hat einInt 
letzendlich den Wert 12.

von Klaus P. (Gast)


Lesenswert?

Hm, wenn du das so erklärst, dann verstehe ich den Sinn des Konstruktors 
nicht, denn im Prinzip kann ich auch ohne Konstruktor die Variablen 
initialisieren, da brauche ich keine extra Funktion dafür.

von Peter II (Gast)


Lesenswert?

Klaus P. schrieb:
> Hm, wenn du das so erklärst, dann verstehe ich den Sinn des Konstruktors
> nicht, denn im Prinzip kann ich auch ohne Konstruktor die Variablen
> initialisieren, da brauche ich keine extra Funktion dafür.

bei C# ja, bei C++ muss man es mit einen Konstruktor machen. (ja in der 
gerade erschienen version vom C Standard ist das auch nicht mehr so)

Im Konstruktor kannst aber zustäzlich parameter übergeben.
1
public class EineKlasse
2
{
3
     private int _einInt;
4
5
     public EineKlasse( int wert )
6
     {
7
         this.einInt= wert
8
     }
9
 
10
}

von Klaus P. (Gast)


Lesenswert?

Peter II schrieb:
> Im Konstruktor kannst aber zustäzlich parameter übergeben.

Aha, das ist der Vorteil davon, wusste nicht dass das geht.

Peter II schrieb:
1
 public EineKlasse( int wert )
2
      {
3
          this.einInt= wert
4
      }

Was macht hier aber das Schlüsselwort "this"?

von --- (Gast)


Lesenswert?


von Klaus P. (Gast)


Lesenswert?

--- schrieb:
> http://msdn.microsoft.com/en-us/library/dk1507sz(v...
> http://en.wikipedia.org/wiki/This_(computer_programming)

Ich lese gerade das Visual C# Buch von galileo computing open book.
Im Kapitel 3 Klassendesign wo ich gerade angekommen bin wird leider 
"this" verwendet ohne erläutert zu werden.

Deshalb meine Frage.

Ich denke aber in C gibt es das Schlüsselwort this nicht oder täusche 
ich mich da?

von Andreas (Gast)


Lesenswert?

Mit this. spricht man eine Variable in den Objekt an.
Den eine Variable, die dem Objekt übergeben wird kann
u.U. genauso bezeichnet sein.

Also z.B.
1
 public EineKlasse( int wert )
2
      {
3
          this.wert= wert
4
      }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus P. schrieb:
> Ich denke aber in C gibt es das Schlüsselwort this nicht oder täusche
> ich mich da?

In C nicht, aber in C++.

Aber C# ist etwas vollkommen anderes, und um C# zu lernen, ist weder ein 
C- noch ein C++-Buch sonderlich hilfreich.

von Klaus (Gast)


Lesenswert?

Ok ein großes Danke an Andreas und Peter II.

Jetzt verstehe ich!

Jedoch bin ich mir bei einer Sache noch nicht ganz Sicher und zwar beim 
"this":
1
public EineKlasse( int wert )
2
{
3
    this.wert= wert
4
}

In diesem Fall mache ich meine ganzen Initialisieungen der Klasse 
EineKlasse im Konstruktor. Das Objekt welches in der Main() 
instanziert/erzeugt bzw. initialisert wird erwartet sich beim 
Initialisieren einen Integer Wert.

Meinst du jetzt dass es passieren kann, dass eine Variable außerhalb des 
Konstruktor mit dem gleichen Namen schon deklariert ist und deshalb this 
vorgesetzt wird?

Ich meine folgendes:
1
    public class Circle
2
    {
3
        //Variablen-Deklarationen
4
        private int _XKoordinate;
5
        private int _YKoordinate;
6
        private double _Radius;
7
        public double _nurLesbar;
8
9
        //Konstruktor(Initialisierung der Klasse)*************
10
        public Circle(double _nurLesbar)
11
        {
12
            _XKoordinate = 0;
13
            _YKoordinate = 0;
14
            _Radius = 0;
15
            if (this._nurLesbar == 50)//Parameter
16
                _nurLesbar = 664.5; //private Variable
17
        }
18
    }

Ich habe das einmal ausprobiert und komme auf folgenden Schluss: Im 
Konstruktor zeigt mir Intellisense nur die Variable _nurLesbar an, die 
dem Parameter entspricht.
Die Variable, die als (private) double bei dem Deklarationen definiert 
ist wird in keiner Weise im Konstruktor angezeigt oder durch 
Intellisense angeboten-sprich ich habe keinen Zugriff auf _nurLesbar 
außerhalb des Konstruktors.

Das bedeutet, dass es keinen Unterschied in dem Sinne macht ein this 
vorzusetzen oder nicht. Der Parameter Name darf einfach nicht gleich 
einer vorher deklarierten Variable sein denn ansonsten darf ich keine 
Zuweisung der Variablen außerhalb des Konstruktors machen.

Stimmt das jetzt oder mache ich irgendetwas falsch?

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Klaus schrieb:
> Jedoch bin ich mir bei einer Sache noch nicht ganz Sicher und zwar beim
> "this":
...
> Meinst du jetzt dass es passieren kann, dass eine Variable außerhalb des
> Konstruktor mit dem gleichen Namen schon deklariert ist und deshalb this
> vorgesetzt wird?

Schau dir mal den von dir geposteten Konstruktor an
Klaus schrieb:
> public EineKlasse( int wert )
> {
>     this.wert= wert
> }
ändere ihn in (this. entfernen)
1
public EineKlasse( int wert )
2
{
3
    wert= wert
4
}
Wenn du nun Compiler wärst, wirst du dich sicher fragen "Ist das Kunst 
oder kann das weg?"

Mit this.wert ist die Variable gemeint die in der Deklaration der Klasse 
EineKlasse steht, wert hingegen ist die Variable die als Parameter im 
Konstruktor angegeben ist.

Du machst hier nichts anderes als die Variable wert der Klasse 
EineKlasse mit dem Parameter wert des Konstruktors zu initialisieren.

Zum Sinn des Konstruktors, man könnte jetzt meinen der ist überflüssig, 
mache ich einfach alles public und initialisiere die Variable in main() 
(oder einer anderen Methode).

1. Du hast mit einem Konstruktor die Möglichkeit Werte vorher auf 
Korrektheit zu prüfen.
2. Ein Funktionsaufruf mit Parametern schreibt sich kürzer als mehrere 
Zeilen mit Initialisierungen von Variablen ;)
3. Das ist schlechtes Klassen-Design

Klaus schrieb:
> Ich habe das einmal ausprobiert und komme auf folgenden Schluss: Im
> Konstruktor zeigt mir Intellisense nur die Variable _nurLesbar an, die
> dem Parameter entspricht.

Da fragt sich woher das 'Intelli' bei IntelliSense her kommen soll, hier 
kommt die IDE anscheinend in einen Konflikt. In dem Konstruktor sollten 
jedenfalls beide Variablen verfügbar sein.

Klaus schrieb:
> Das bedeutet, dass es keinen Unterschied in dem Sinne macht ein this
> vorzusetzen oder nicht.

doch es macht einen Unterschied, s.o.

> Der Parameter Name darf einfach nicht gleich
> einer vorher deklarierten Variable sein denn ansonsten darf ich keine
> Zuweisung der Variablen außerhalb des Konstruktors machen.

Doch der Parametername darf genau so heißen wie eine Variable der Klasse 
um aber beide Variablen unterscheiden zu können braucht es this um dem 
Compiler mit zu teilen welche Variable du meinst.

Von wo aus du auf die Variablen einer Klasse zugreifen darfst bestimmen 
die Schlüsselwörter public, protected und private bei der Deklaration 
der Variablen.

von Klaus (Gast)


Lesenswert?

Ok, verstehe wo mein Problem lag. Ich habe nämlich gedacht, dass "this" 
für alles was im Block definiert wurde angewendet werden muss.

Herauskan jedoch, dass ich this für alle Variablen, die in der Klasse 
definiert sind anwenden muss.
ALso einfach umdrehen und das Problem hat sich.

Dankeschön MK!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus schrieb:
> Herauskan jedoch, dass ich this für alle Variablen, die in der Klasse
> definiert sind anwenden muss.

Nein, das musst Du nicht. Das musst Du nur dann, wenn in einer Funktion 
("Methode") lokale Variablen bzw. Funktionsparameter gleichen Namens 
verwendet werden, um auf die durch den gleichen Namen überdeckte 
Membervariable zuzugreifen.

Würde der Deinem Konstruktor übergebene Parameter nicht "wert" heißen, 
so wäre kein this erforderlich:
1
public class EineKlasse
2
{
3
  private int wert;
4
5
  public EineKlasse(int bla)
6
  {
7
    wert = bla;
8
  }

Eine Möglichkeit, Membervariablen als solche zu kennzeichnen, ist die 
Verwendung von Namenspräfixen, wie es im microsoftlastigem Umfeld mit m_ 
gemacht wird:
1
public class EineKlasse
2
{
3
  private int m_wert;
4
5
  public EineKlasse(int bla)
6
  {
7
    m_wert = bla;
8
  }

Aber das ist natürlich nur eine von vielen möglichen Konventionen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.