Avatar billede j_jorgensen Nybegynder
30. maj 2005 - 19:54 Der er 14 kommentarer og
1 løsning

StackOverflowException som ikke burde opstå

Hej alle,

har følgende property i koden:

public int score
{
    get
    {
        return score;
    }
    set
    {
        score = value;
    }
}

Ved "score = value" får jeg den exception. Det eneste sted hvor jeg tildeler score en værdi, giver jeg den værdien 2...hvilket jo ikke skal rejse nogen alarm-flag. Er der mon nogen der har en idé til hvorfor h*... det går galt?
Avatar billede arne_v Ekspert
30. maj 2005 - 19:56 #1
hvilken exception ?
Avatar billede nielle Nybegynder
30. maj 2005 - 19:56 #2
Sådan:

private int _score;
public int score
{
    get
    {
        return _score;
    }
    set
    {
        _score = value;
    }
}
Avatar billede arne_v Ekspert
30. maj 2005 - 19:59 #3
he he - jeg skal nok lære at læse overskriften ...
Avatar billede j_jorgensen Nybegynder
30. maj 2005 - 20:03 #4
Ah...great! Tak! Det var ihvertfald let tjente point :-)

Hvad er grunden til denne exception? Hvorfor opstår den?

Og - en anden ting - hvorfor denne navngivning med _ foran navnet?
Avatar billede nielle Nybegynder
30. maj 2005 - 20:09 #5
Grunden til at du fik en ekception når du f.eks. skrev:

score = 2;

- er at du kalder set-delen:

set
{
    score = value;
}

- men der står jo:

score = value;

- og det betyder at du kalder set-delen endnu engang. Denne kalder set-delen igen og du har m.a.o. en uendelig loop. Altså indtil at din stack løber over.
Avatar billede nielle Nybegynder
30. maj 2005 - 20:12 #6
Man bryder denne loop ved at indsætte den private variabel _score. Der er i øvrigt intet som helst magisk ved den foranstillede understreg; det er bare min måde at indikere at "_score" og "score” høre sammen.
Avatar billede j_jorgensen Nybegynder
30. maj 2005 - 20:15 #7
Ah på den facon...det er jo meget smart egentlig. Jeg har set _ brugt mange andre steder på samme måde, så jeg tænkte at der nok var en grund til det...

Anyway, tak for hjælpen...lægger du et svar?
Avatar billede nielle Nybegynder
30. maj 2005 - 20:16 #8
Bare lige for at gøre forklaringen komplet; Du ville også have fået en exception hvis du havde brugt score på højresiden af dit lighedstegn:

int TotalScore = score;

Dette ville nemlig have resulteret i at get-delen gik i loop.
Avatar billede nielle Nybegynder
30. maj 2005 - 20:17 #9
Et svar :^)
Avatar billede arne_v Ekspert
30. maj 2005 - 20:17 #10
ofte vil man iøvrigt bruge navne konventionen:

private int score;
public int Score
{
    get
    {
        return score;
    }
    set
    {
        score = value;
    }
}

i C#.

Men konverterer man koden til VB.NET så har man et problem ....
Avatar billede nielle Nybegynder
30. maj 2005 - 20:24 #11
Jeg har også set konventionen:

private int m_score;
public int score
{
    get
    {
        return m_score;
    }
    set
    {
        m_score = value;
    }
}

Jeg tror at 'm' her står for "method" - men det giver ikke rigtig mening eftersom at det jo ikke er en method men en property.
Avatar billede j_jorgensen Nybegynder
30. maj 2005 - 20:35 #12
VB.NET - puhada...ikke bande :)
Avatar billede arne_v Ekspert
30. maj 2005 - 20:41 #13
m for member

den konvention kommer fra C++ så vidt jeg ved
Avatar billede spif2001 Nybegynder
30. maj 2005 - 21:25 #14
Den måde jeg ser mest og altid selv bruger er at den globale attribut staves med lille forbogstav og property'en med stort forbogstav.

public int Score
{
  get{return this.score;}
  set{this.score = value;}
}

Det kan være en god idé at bruge this. foran globale attributter og kald til metoder inden i klassen, da koden bliver lettere at læse og nemmere at overskue.
Avatar billede burningice Nybegynder
31. maj 2005 - 01:14 #15
spif2001>> og for at være rigtig fin på den siger man at man bruger camelcasing til det der er private, og pascalcasing til public og protected.

http://en.wikipedia.org/wiki/CamelCase
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconcapitalizationstyles.asp
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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