Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C++CLI / VB .Net / .Net-Framework » StackoverflowException bei getter und setter

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.10.2006, 10:46 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ich arbeite in meinen Projekten recht viel mit gettern und settern, da ich aus der Java Welt komme. Jetzt habe ich aber das Problem, das ich eine Stackoverflowexception bekomme, wenn ich mit gettern und settern arbeite. Bei public cariablen geht alles einwandfrei.

Ich hab mir das alles im Debugger mal angesehen und er springt immer wieder zum setter. Wie in einer Endlosschleife. Es sind zwar 3 Schleifen ineinander verschachtelt, sind aber keine Endlosschleifen. Und wie gesagt, wenn ich anstatt den setter zu benutzen direkt auf die öfentliche Variable zugreife funktioniert das einwandfrei. Hier mal einmal der Code, der den Fehler erzeugt und die einfache Klasse, in der die getter und setter nicht funktionieren.


C++:
        XmlReader( String url )
        {
            values = new Hashtable();
            faecher = new List<string>();
            
            XmlDocument doc = new XmlDocument();
            doc.Load(url);

            XmlElement root = doc.DocumentElement;
            XmlNodeList faecherList = root.ChildNodes;
            foreach(XmlNode article in faecherList)
            {
                XmlNodeList entries = article.ChildNodes;
                Hashtable testingtable = new Hashtable();
                foreach(XmlNode entry in entries)
                {
                    XmlNodeList items = entry.ChildNodes;
                    XmlAttributeCollection atts = entry.Attributes;
                    XmlAttribute id = atts["id"];
                    foreach(XmlNode item in items)
                    {
                        /* z.B.:
                         * article.Name == "Englisch"
                         * item.Name == "content"
                         * item.InnerText == "foo"
                         * id.InnerText == "2"
                         */

                        if(item.Name == "content")
                        {
                            _content = item.InnerText;
                        }
                        else if(item.Name == "title")
                        {
                            _headline = item.InnerText;
                        }
                        else if(item.Name == "datum")
                        {
                            _date = item.InnerText;
                        }
                    }
                    _id = int.Parse(id.InnerText);
                    faecher.Add(article.Name);
                    //hier kommt die StackOverflowException - aber nur bei den get und set
                    val = new XmlValues(article.Name, _headline, _date, _content, _id);
                    values.Add(_id, val);
                }

            }



Und hier meine funktionierende XmlValues:


C++:
using System;
using System.Collections.Generic;
using System.Text;

namespace SchoolWriter.XMLKlassen
{
    class XmlValues
    {
        public XmlValues( string fachName, string headline, string datum, string content, int id )
        {
            this.FachName = fachName;
            this.Headline = headline;
            this.Content = content;
            this.Datum = datum;
            this.id = id;
        }

        public string Headline = null;
        /*{
            get
            {
                return headline;
            }
            set
            {
                headline = value;
            }
        }*/


        public string FachName = null;
        /*{
            get
            {
                return this.FachName;
            }
            set
            {
                this.FachName = value;
            }
        }*/


        public string Datum = null;
        /*{
            get
            {
                return Datum;
            }
            set
            {
                Datum = value;
            }
        }*/


        public string Content = null;
        /*{
            get
            {
                return Content;
            }
            set
            {
                Content = value;
            }
        }*/


        public int id ;
        /*{
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }*/

    }
}


Wenn ich aber beispielsweise Content so anpasse:

C++:
        public string Content
        {
            get
            {
                return Content;
            }
            set
            {
                Content = value;
            }
        }


Geht nichts mehr. Visual Studio sagt mir nur: "Stellen Sie sicher, das Sie sich in keiner Endlosschleife befinden". Bin ich definitiv nicht ...

Jemand ne Idee ? Also der Code funktioniert zwar, trotzdem würde ich des Designs halber lieber mit gettern und settern arbeiten, vor allem um bei get evtl auch direkt Datentypkonvertierungen durchführen zu können.
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.10.2006, 11:17 Uhr
ao

(Operator)



Zitat von J-jayz-Z:

C++:
        public string Content
        {
            get
            {
                return Content;
            }
            set
            {
                Content = value;
            }
        }


Geht nichts mehr. Visual Studio sagt mir nur: "Stellen Sie sicher, das Sie sich in keiner Endlosschleife befinden". Bin ich definitiv nicht ...

Doch, bist du, definitiv. Content ruft rekursiv Content auf. Machs im Debugger, dann siehst du es.

Normalerweise schreibt man das so:

C++:
class XmlValues
    {

        string content;

        public XmlValues( string fachName, string headline, string datum, string content, int id )
        {
            this.Content = content;
            // Linke Seite: this.Content oder this.content ist hier egal, solange das Property
            // Content nichts weiter macht als den Inhalt zuweisen.

            // Rechte Seite: content ist der formale Parameter. Das Klassenmember content
            // wird dadurch verdeckt und ist nur über this.content erreichbar.
        }

        public string Content // Großschreibung -> öffentliches Property
        {
            get
            {
                return content; // Kleinschreibung -> privates Member
            }
            set
            {
                content = value;
            }


ao

Dieser Post wurde am 17.10.2006 um 11:20 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.10.2006, 12:53 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



wieso bin ich da nicht selbst drauf gekommen, als ich das im Debugger gesehen hab ...
Er ist immer wieder zu "set" gesprungen und ich dachte mir, das kann nicht sein, da die set Methode ja eigentlich nur im Konstruktor aufgerufen wird. Das die set Methode das ebenfalls nochmal macht kam mir da nicht in den Sinn ... Dank dir
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C++CLI / VB .Net / .Net-Framework ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: