2010-04-18 5 views
1

Je jouais juste avec du code dans LINQPad et j'ai réussi à planter le programme avec une exception stackoverflow.Renvoi d'une propriété statique à partir de la propriété d'instance publique

J'ai fondamentalement créé une propriété statique dans un champ et utilisé une propriété pour renvoyer la valeur d'une instance.

Le getter de ma propriété d'instance renvoie la valeur du champ statique, mais le setter se définit lui-même. Quand ce type de modèle serait-il utilisé et comment cela a-t-il généré une exception de stackoverflow?

exemple de code de ce que je faisais:

void Main() 
{ 
    SomeClass myinstance = new SomeClass(); 
    SomeClass.x = "Some Value"; 
    myinstance.y = "Some other value"; 
    myinstance.y.Dump(); 
} 

public class SomeClass 
{ 
    public static string x; 

    public string y 
    { 
     get { return x; } 
     set { y = value; } 
    } 
} 

Répondre

4

C'est la première chose que je l'ai fait avec des propriétés :) - vous appelez récursive le poseur y plutôt que de créer un champ de support. Comme il s'appelle lui-même, il finira par stackoverflow.

Chaque setter est du sucre syntaxique et est fondamentalement un appel de méthode. Ce que vous avez fait est essentiellement équivalent à faire cela avec une méthode:

public class SomeClass 
{ 
    public string GetValue() { return "some string"; } 
    public void SetValue(string arg) 
    { 
     SetValue(arg); // recursively calls itself until stackoverflow 
    } 
} 
+0

oh oui! Merci Mark. Quelle erreur de débutant: P –

+0

Facile à faire ... Je suis sûr que beaucoup de gens l'ont fait :) –

1

Vous avez écrit y = value; au lieu de x = value; dans le setter!

Notez que pour les propriétés simples que vous pouvez utiliser

public string y { get; set; } 

qui va générer automatiquement un champ caché.

+0

Merci Danvil. Je n'ai pas utilisé une propriété automatique pour cela parce que je testais ce qui se passe lorsque vous renvoyez la valeur d'un champ statique à partir d'une propriété non statique. :) –

+0

Je vois, donc ma réponse a été en quelque sorte mal dirigée alors :) – Danvil

Questions connexes