2017-06-19 1 views
0

J'ai écrit une application qui consomme un service Web, télécharge des données au format JSON, la désérialise en classes. Le service est basé sur PHP (je crois).L'encapsulation en ligne a cessé de fonctionner

Récemment, le service Web a eu une mise à jour qui a eu des conséquences inattendues sur mes déclarations de classe. Jusqu'à récemment, j'utilise cette ligne pour l'une des variables de classe

public string consent_id { get { return consent_id.ToUpper(); } set { consent_id = value; } } 

et il a apparemment travaillé bien. Cependant, depuis la mise à jour de leur service. Cela a été à l'origine d'une exception de débordement de pile et j'ai dû changer le code pour

string Consent_id; 
public string consent_id { get { return Consent_id.ToUpper(); } set { Consent_id = value; } } 

Il se sent comme la première ligne a commencé à appeler récursive l'encapsulateur set.

Est-ce que quelqu'un sait pourquoi le premier a cessé de fonctionner? La raison de son lancer une exception de débordement de pile? Y at-il un moyen de définir le Getter sans régler le Setter inline afin de ne pas encapsuler tout ce qui nécessite un Getter modifié?

Merci

+0

Dans votre première ligne, vous appelez récursivement getter lorsque vous appelez 'return consent_id.ToUpper();'. Donc, c'est une bonne pratique d'utiliser le support déposé dans ce cas. Et vous ne pouvez pas définir un corps de getter sans définir un corps de setter –

+0

@GeorgeAlexandria Lors des tests, nous avons pris le ToUpper() et il n'a pas changé. C'était le Setter qui lançait l'exception aussi. – Seige

+0

Avez-vous testé le premier exemple ou le second avec le champ de support? –

Répondre

1

La première option n'aurait jamais fonctionné. Il déclenche une exception de débordement de pile car dans le getter, vous appelez le getter, qui appelle le getter, qui appelle le getter, et ainsi de suite, jusqu'à ce que vous manquiez d'espace de pile.

+0

Existe-t-il une autre façon de le faire en ligne? Je ne peux pas sembler être en mesure de définir un sans l'autre. Je pensais que le passeur ne s'appellerait pas de l'intérieur de lui-même. Quelque chose de nouveau chaque jour. – Seige

+0

@Seige Si vous ne voulez pas utiliser une propriété auto, vous devez stocker la valeur * quelque part *, que ce soit dans un champ, une autre propriété, un autre emplacement ou quelque chose. La seule façon d'avoir un champ implicite est pour une auto-propriété. – Servy

+0

Avec une auto-propriété, n'est-ce pas la même chose que l'encapsulation complète par défaut, mais en abrégé? ou fait-il quelque chose de différent en interne? J'aurais pensé mettre le code par défaut dans le setter serait le même que la propriété auto. D'où mon code. – Seige