2009-11-27 2 views
2

J'ai une classe non statique dans laquelle j'ai plusieurs propriétés, ie serverURL, serverPort etc, et la classe a un constructeur. Le constructeur accepte les arguments qu'il utilise ensuite pour 'définir' les propriétés, en les initialisant. Voici le code:Pourquoi ai-je un débordement de pile lors de l'utilisation des propriétés dans le constructeur?

public Server(string newServerAddress, int newServerPort) { 

     serverAddress = newServerAddress; 
     serverPort = newServerPort; 
} 

public string serverAddress { 
    get { 
     return serverAddress; 
    } 
    set { 
     serverAddress = value; 
    } 
} 
public int serverPort { 
    get { 
     return serverPort; 
    } 
    set { 
     serverPort = value; 
    } 

Pour une raison quelconque, cela me donne une erreur de dépassement de pile, et je ne sais pas pourquoi. Voici le code utilisé pour l'appeler:

Server test = new Server("server.url.here",8080); 

Ce code est évidemment lié par une classe, mais je l'ai laissé ici. C'est un problème d'amateur, et j'ai déjà fait des choses comme ça, mais je suis complètement désorienté par ce qui se passe, et quand j'essaye de le déboguer en studio visuel, ça me dit qu'il ne peut pas le déboguer, probablement car il utilise la pile pour déboguer.

Répondre

3

Vous avez oublié d'utiliser un champ de support pour les propriétés. L'accesseur de propriété utilise la propriété elle-même, récursive indéfiniment. Fix comme ceci:

private string mServerAddress; 
public string serverAddress { 
    get { 
     return mServerAddress; 
    } 
    set { 
     mServerAddress = value; 
    } 
} 

Ou utilisez la syntaxe de propriété automatique:

public string ServerAddress { get; set; } 
5

Respecter la casse. La propriété revient elle-même.

public string serverAddress { 
    get { 
     return serverAddress; // recursing here 
    } 
} 
+0

Ah, merci. Ils ressemblent plus à une interface publique qu'à un champ, ce qui me déroute. – George

1

Vous avez la récursion dans setter ou getter de propriété. Essayez ce code à la place:

public Server(string newServerAddress, int newServerPort) {  
     serverAddress = newServerAddress; 
     serverPort = newServerPort; 
} 

public string serverAddress { get; set; } 
public int serverPort { get; set; } 
1

Vous référencez le compositeur dans le setter ...

au sein de votre serverAddress de propriété, vous avez la ligne :

serverAddress = value 

qui va aller à l'accesseur setter pour la propriété server op inifintely ...

utilisez la syntaxe suivante:

private string _serverPort; 
public string ServerPort 
{ 
get { return _serverPort; } 
set { _serverPort = value; } 
} 

Hope this helps :)

Questions connexes