2010-03-02 5 views
2

Je débogue un code et une chose étrange se produit. Il existe une propriété de chaîne, MyProperty. Lorsque j'ajoute un point d'arrêt au setter de la propriété et au constructeur par défaut (le seul constructeur), le setter est appelé en premier. Je ne sais pas ce qui se passe à l'autre niveau du code mais cela me semble étrange en tout cas. Tous les membres sont non statiques. La classe a un attribut [DataContract] et les membres sont [DataMember]. Quelqu'un peut-il expliquer cela?Setter est appelé avant le constructeur

Je ne peux pas partager plus de code que celui-ci. Le code est également dans un projet Silverlight. Est-ce lors de la désérialisation de la WCF?

+0

Le constructeur est appelé du tout? –

+1

Vous ne partagez aucun code. ;) Mais pour moi, cela ressemble à ce que vous essayez d'utiliser la classe, avant que vous ayez créé une instance. – Bobby

+4

Écrivez un petit programme pour montrer le problème. Ce n'est probablement pas quoi/où vous pensez que c'est. En ce moment, ce n'est pas vraiment une question. –

Répondre

5

Dans la désérialisation WCF, le constructeur n'est pas appelé du tout. C'est par conception. Les objets WCF sont conçus pour être des objets de transport de données, et toute logique qui se cache derrière les setters et les getters est dangereuse au mieux. Les chances sont, vous voyez ce comportement et préoccupé par cela parce que vous avez quelque chose qui se passe dans la logique métier qui réside dans le setter. Pour contourner ce problème, je suggérerais de ne décorer que les propriétés et champs automatiques avec l'attribut [DataMember], ce qui empêchera toute autre logique d'être déclenchée. De même, faites attention à toute logique qui serait exécutée dans le constructeur, cette logique ne sera pas exécutée pendant la désérialisation.

+2

Wow! C'est surprenant, avez-vous des références pour cela? Je ne peux pas imaginer comment un schéma de sérialisation n'appellerait pas un constructeur mais assignerait des valeurs de propriété via leurs méthodes de mutateur. – AnthonyWJones

+0

Oui, il s'agit d'une sérialisation WCF, je suppose que nous utilisons les services WCF. – Tanmoy

+0

J'ajoute la logique de validation au setter comme le blog suivant http://msmvps.com/blogs/theproblemsolver/archive/2008/12/30/data-validation-silverlight-versus-wpf-part-2.aspx et obtenir _errors null exception à l'intérieur de setters pour cette raison. Comment puis-je contourner cela? – Tanmoy

Questions connexes