2011-09-20 1 views
0

J'ai une classe très simple C#:asp.net C# l'exception des propriétés de classe

namespace mybox 
{ 
    public class userAccount : IMyInterface 
    { 
     public userAccount() 
     { 
     } 
     private int _userId; 
     private string _userName; 

     public int userId 
     { 
      get { return _userId; } 
      set { userId = value; } 
     } 
     public string userName 
     { 
      get { return _userName; } 
      set { userName = value; } 
     } 

     public string list(int myUserId) 
     { 
      ... 
      myOutPut = string.Format("{0} {1} {2}", u.userId, u.userName); 
      return myOutPut.ToString(); 
     } 

    public void add() 
    { 
      pillboxDataContext db = new pillboxDataContext(); 
      userAccount newUser = new userAccount(); 
      newUser.userName = "test123"; 

      db.SubmitChanges(); 
     } 
    } 
} 

Dans mes default.aspx.cs en cas Page_Load J'essaie d'appeler la méthode de la liste:

protected void Page_Load(object sender, EventArgs e) 
{ 
    pillbox.userAccount myUA = new pillbox.userAccount(); 
    myUA.add(); 

// Console.WriteLine (myUA.list (1));

} 

Quand j'appelle la méthode add je peux voir qu'il tente d'attribuer la valeur test123 à la propriété, mais je reçois le message suivant:

Une exception non gérée du type « System.StackOverflowException » eu lieu dans App_Code.1zm0trtk.dll

Des idées de ce que je fais de façon incorrecte?

Répondre

5

Le problème est avec la façon dont vous définissez vos propriétés.

Vous essayez de faire référence à la propriété à laquelle vous attribuez la valeur dans le setter qui aboutit à une récursion infinie (pour être spécifique, cette ligne la déclenche newUser.userName = "test123";).

les changer pour:

public int userId   
{    
    get { return _userId; }    
    set { _userId = value; }   
}   

public string userName   
{    
     get { return _userName; }    
     set { _userName = value; }   
} 
+0

OK - Erreur stupide de ma part ... Merci! – webdad3

2

Vous devez définir le champ de sauvegarde privé, pas la propriété. Sinon, vous entrez dans une récursion infinie lorsque vous appelez vous-même tout le temps.

private int _userId; 
    private string _userName; 

    public int userId 
    { 
     get { return _userId; } 
     set { _userId = value; } 
    } 
    public string userName 
    { 
     get { return _userName; } 
     set { _userName = value; } 
    } 

Dans votre cas, vous pouvez simplement utiliser les propriétés mises en œuvre auto (j'ai changé le boîtier pour correspondre aux directives):

public int UserId { get; set; } 
public string UserName { get; set; } 
+0

erreur stupide de ma part. Merci! – webdad3

+0

Il semble que toutes les réponses sur ce post ont obtenu un -1 par quelqu'un ... – driis

+0

@driis ouais je sais, encore étrange lorsque les trois réponses étaient correctes –

3

C'est parce que userName appelle lui-même. Vous avez probablement voulu confier le terrain:

Cette ligne est faux:

set { userName = value; } 

Vous vouliez écrire:

set { _userName = value; } 
+0

merci ... c'était un oubli total. – webdad3

2

Si vous ré-écrivez vos setters un peu, il est facile de voir ce qui se passe. Les get et set sur une propriété sont en fait compilés jusqu'aux méthodes (PropType get_PropName() et void set_PropName(PropType value)), et toutes les références à la propriété sont compilées aux appels à la méthode appropriée.Donc, ce code:

int i = myObj.MyIntProp; 
myObj.MyIntProp = 6; 

compile à

int i = myObj.get_MyIntProp(); 
myObj.set_MyIntProp(6); 

Ainsi, votre poseur

set 
{ 
    username = value; 
} 

compile en fait

public void set_username(string value) 
{ 
    set_username(value); 
} 

Et maintenant la cause du débordement de la pile est évidente .

Questions connexes