Avatar billede lajer Nybegynder
08. juli 2003 - 16:33 Der er 4 kommentarer og
1 løsning

Exception of type System.StackOverflowException was thrown.

Hej!

Jeg har lavet en class hvori jeg vil sætte en DateTime property.

Men så snart jeg sætter denne for jeg følgende exception:

Exception of type System.StackOverflowException was thrown.

Jeg har søgt en del steder for at finde ud af hvorfor denne exception opstår, men har kun fundet sites der siger at det er pga. et uendeligt loop.
Jeg har imidlertidigt ingen loops på siden og alle andre properties kan sættes uden problemer.

Any ideas.

mvh
Torben Lajer
Avatar billede nielslbeck Nybegynder
08. juli 2003 - 18:09 #1
Det er fuldstændig korrekt, at du må ha' en eller anden form for loop... Det kunne tænkes, at du gør noget i stil med:

private DateTime oprettet;

public DateTime Oprettet  {
    get { return oprettet; }
    set { Oprettet = value; }
}

Ovenstående vil give en StackOverflowException, da jeg har lavet en lille fejl! I min "set" sætter jeg Oprettet lig en værdi, men Oprettet er jo min property, og dermed opstår der et uendeligt loop...

Du må ha' en tilsvarende fejl - evt af en property der kalder en property som kalder en property som kalder... osv...

Hvis du kommmer med noget kode, skulle vi hurtigt kunne få løst det problem :-)
Avatar billede lajer Nybegynder
08. juli 2003 - 18:16 #2
Først Class'en der indeholder 2 dateTime properties

// --------------------
public class DataHolder
{
    private DateTime    m_DateStart;
    private DateTime    m_DateEnd;

    public DataHolder()
    {
      m_DateStart = DateTime.Now;
      m_DateEnd  = DateTime.Now;
    }

    public DateTime DateStart
    {
      get
      {
        return m_DateStart;
      }
      set
      {
        DateStart = value;
      }
    }

    public DateTime DateEnd
    {
      get
      {
        return m_DateEnd;
      }
      set
      {
        DateEnd = value;
      }
    }
}


I den anden Class laves der en ny instans af DataHolder, sådan her:

DataHolder dh = new DataHolder();

Kan jo ikke gøres meget anderledes ;)

Hvorefter de to DateTime properties bliver sat ( i OnInit )

dh.DateStart = DateTime.Now;
dh.DateEnd  = DateTime.Now;


Jeg kan ikke se hvorfor jeg ikke må sætte DateEnd = value; som du skriver i ovenstående svar. Kan du give en lidt mere specifik forklaring her på?

På forhånd tak :)
Avatar billede nielslbeck Nybegynder
08. juli 2003 - 18:20 #3
Du skal bruge:

public class DataHolder
{
    private DateTime    m_DateStart;
    private DateTime    m_DateEnd;

    public DataHolder()
    {
      m_DateStart = DateTime.Now;
      m_DateEnd  = DateTime.Now;
    }

    public DateTime DateStart
    {
      get
      {
        return m_DateStart;
      }
      set
      {
        m_DateStart = value;
      }
    }

    public DateTime DateEnd
    {
      get
      {
        return m_DateEnd;
      }
      set
      {
        m_DateEnd = value;
      }
    }
}

Ligesom du returnerer værdierne fra m_DateStart og m_DateEnd er det også de to værdier der skal sættes i dine "set". Når du et sted i din kode skriver dh.DateStart = DateTime.Now vil der blive udført følgende af din kode:

DateEnd = value;

Der vil derefter blive udført følgende:

DateEnd = value;

Osv...

Håber du forstår...
Avatar billede lajer Nybegynder
08. juli 2003 - 18:25 #4
Argh, fy for en bug. Jeg havde ikke set at jeg mangle m_ foran set :)

Men jeg takker mange gange for hjælpen :)

mvh
Torben Lajer
Avatar billede nielslbeck Nybegynder
08. juli 2003 - 18:25 #5
Hæ hæ... okay :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester