Verständnisproblem mit Code aus C#-Buch



  • Hallo.
    Ich lerne gerade C# mit Visual C#2010 und hätte dazu mal ne Frage:

    public Circle()      //hier habe ich _CountCircles, aber bei den anderen nicht?
    {
    _CountCircles++;
    }
    
    public Circle(double radius) :this()   //warum nicht radius in this?
    {
    Radius = radius;
    }
    
    public Circle(double radius, int xPos, int yPos) : this(radius)  //warum hier in this?
    {
    YCoordinate = xPos;
    XCoordinate = yPos;
    }
    

    verwirrend.

    und noch was:

    private double _Radius;
    public int XCoordinate { get; set; } //hier get set leer
    public int YCoordinate { get; set; } //hier get set leer
    public double Radius { get; set; }   //get set beinhalten Code
    

    Warum brauch ich ein privates Feld _Radius, wenn ich eine Eigenschaftsmethode habe? Andersrum, warum brauch ich keine privaten Felder, wenn ich Eigenschaftsmethoden habe? (YCoordinate, XCoordinate)

    Danke
    gruß
    syntax



  • Naja, es gibt gute Bücher und schlechte Bücher, wär ja nichts neues.

    Wegen deiner ersten Frage, die anderen Konstruktoren rufen den ersten Konstruktor auf. Bzw. der dritte Konstruktor ruft den zweiten auf, der wiederum den ersten aufruft.

    Das mit der Property Radius und dem Feld _Radius ist wohl Schlamperei, seh jetzt jedenfalls keinen tieferen Sinn dahinter.



  • Soviel zur 5. aktualisierten und vollständig überarbeiteten Auflage 🤡

    Nach welchen Kriterien werden dann die Konstruktoren aufgerufen? Von dem, der die meisten Parameter hat bis zu dem, der die wenigsten hat? 😕 Hab ich nämlich bis jetzt nirgends gelesen.

    Bezüglich Properties:
    Wenn ich Properties habe, brauch ich dann kein privates Feld? 😕

    Andere Frage:
    Buch verbrennen und anderes besorgen?

    Danke
    gruß
    syntax



  • Es immer wird der passende Konstruktor aufgerufen. Das ist ja das this hinter dem Doppelpunkt. Durch die Parameter ist eindeutig bestimmt, welcher Konstruktor aufgerufen wird. Das ist so ein delegating constructor, was C++11 jetzt auch kann. War das deine Frage?

    Properties kapseln normal den Zugriff auf ein Feld. Das würdest du normal so schreiben:

    double Radius
    {
      get[ return _Radius;}
      set[ _Radius = value; }
    }
    

    Und

    public double Radius {get; set; }
    

    ist nur eine Abkürzung dafür, die in .NET 3.5 glaub eingeführt wurde. Weil Properties zu 98% ja doch nichts anderes machen. Das private Feld macht dann der Compiler selber.

    Keine Ahnung, wie die C# Bücher sind, hab schon ewig keine mehr gelesen. Das ist im Grunde alles so einfach, da brauchst im Gegensatz zu C++ nicht unbedingt ein Buch.



  • Danke, das war meine Frage.

    this(radius) ruft Circle(double radius) auf und this() den Cricle();
    

    passt verstanden.

    OK ich werds mal durcharbeiten. Danke dir nochmal.

    gruß
    syntax



  • Ich finde den Aufruf mit den Ctors schlecht.
    Eine Aufrufkette und jeder Initialisiert was anderes, ich würde viel lieber alles in dem Ctor machen wo alle Elemente bekannt sind und die anderen Ctors diesen aufrufen lassen.

    public Circle()
        : this(0, 0, 0)
    {   
    }
    
    public Circle(double radius)
        :this(0, 0, 0)
    {
    }
    
    public Circle(double radius, int xPos, int yPos)
        : this(radius)
    {
        Radius = radius;
        YCoordinate = xPos;
        XCoordinate = yPos;
        _CountCircles++;
    }
    

    Dadurch hat man immer nur 1 Ctor den man lesen muss. Übersicht FTW. (Wenn man doch eine "Aufrufkette" machen will, dann aber vom kleinsten (oben) nach dem Größten runter (unten)

    Aber um ehrlich zu sein sind die beiden oberen Ctors überflüssig, einfach die Werte aus Optional einstellen und man hat das selbe (Das ist aber wiederum Geschmackssache)

    public Circle(double radius = 0, int xPos = 0, int yPos = 0)
        : this(radius)
    {
        Radius = radius;
        YCoordinate = xPos;
        XCoordinate = yPos;
        _CountCircles++;
    }
    


  • David W schrieb:

    ...

    Du meinst wohl so:

    public Circle()
        : this(0, 0, 0)
    {   
    }
    
    public Circle(double radius)
        :this(radius, 0, 0)
    {
    }
    
    public Circle(double radius, int xPos, int yPos)
    {
        Radius = radius;
        YCoordinate = xPos;
        XCoordinate = yPos;
        _CountCircles++;
    }
    

    Oder

    public Circle(double radius = 0, int xPos = 0, int yPos = 0)
    {
        Radius = radius;
        YCoordinate = xPos;
        XCoordinate = yPos;
        _CountCircles++;
    }
    


  • Jup - war hier im Forum nur schnell Zusammengeklöppelt ohne nochmal gegen zu lesen 😃


Log in to reply