2008-12-15 4 views
33

Je connais java et je mettrais normalement les méthodes getter/setter. Je suis intéressé à le faire en C# avec le code suivant, mais il déclenche une exception StackOverflow. Qu'est-ce que je fais mal?Pourquoi le jeu de propriétés lance-t-il l'exception StackOverflow?

appelle le code

c.firstName = "a"; 

Code de la propriété

public String firstName; 
{ 
    get 
    { 
     return firstName; 
    } 
    set 
    { 
     firstName = value; 
    } 
} 

Répondre

83

C'est parce que vous appelez récursivement la propriété - dans le set vous définissez la propriété à nouveau, qui continue ad infinitum jusqu'à ce que vous souffler la pile.

Vous avez besoin d'un champ de support privé pour conserver la valeur, par ex.

private string firstName; 

public string FirstName 
{ 
    get 
    { 
     return this.firstName; 
    } 
    set 
    { 
     this.firstName = value; 
    } 
} 

Sinon, si vous utilisez C# 3.0, vous pouvez utiliser un auto-propriété, ce qui crée un champ de support caché pour vous, par exemple

public string FirstName { get; set; } 
+0

Vous avez une erreur dans votre premier exemple. Supprimez le point-virgule après Prénom. Picky, je sais. Peu importe, je vais le réparer – Les

+0

Fixe ... seulement 4 ans de retard ;-) –

+9

Il n'est jamais trop tard pour corriger les bugs :) –

12

Vous définissez le nom de la propriété dans votre propriété - pas le nom du champ. Cela fonctionnerait mieux:

private m_firstName; 

public String firstName; 
{ 
    get 
    { 
     return m_firstName; 
    } 
    set 
    { 
     m_firstName = value; 
    } 
} 
+4

J'ai moi-même fait cette erreur ... –

+0

C'est encore plus amusant quand vous en trouvez un dans le code d'une bibliothèque tierce ... –

Questions connexes