J'essaie d'écrire une fonction d'extension de SafeAdd pour la classe de liste, donc si ce n'est pas encore initialisé - Initialisez-le et ajoutez une nouvelle valeur. Mais après mon retour de la méthode d'extension, ma liste vient d'initialiser est égale à NULL. Ce qui ne va pas?
Classe de test: P>
Test t = new Test();
t.items.safeAdd("testWord");
//Here t.items == null; WHY?
3 Réponses :
Vous n'avez attribué que à une variable de méthode locale (qui n'existe que dans la méthode de l'extension) - cela ne fait rien pour appeler le jeu Cela initialisera automatiquement et attribuera la liste la première fois qu'elle est accessible. P> Il ne serait pas thread-coffre-fort à moins que Je synchis ou (peut-être préférable) utilisé code>, et pour être honnête, il n'y a pas de moyen pratique d'obtenir Accédez aux Get CODE> et SET CODE> SANS SANS VERBOSE, ou en utilisant beaucoup de réflexion / Expression code> Code. Imo juste le faire dans la classe: interocked.careexchange code> Â pour l'assignation. Voir en verrouillé
Il pourrait être assez sûr de la sécurité du thread, mais il s'agit rarement d'une exigence de méthodes d'instance, et
Mais non seulement vals-éléments code> sont clonés dans une méthode? Je pensais que nous devrions utiliser ref code> ou out code> les modificateurs que pour eux ..
@Jentor Sauf indication contraire, tout est transmis par la valeur, y compris les types de référence où la référence est transmise par la valeur, alors modifiez ce que le point de paramètre doit ne pas modifier ce que l'argument a passé des points à et que vous ne pouvez pas utiliser ref tant que vous ne pouvez pas utiliser. ce
Cette méthode ne fonctionnera pas pour moi. Tout ce genre de choses est parce que je veux me débarrasser de Serialize Sur-tête: Si je serai sérialisez la classe où la liste == null, je vais obtenir {"_id": "07445FA8-5A51-414B-B0D6-590076AF5F81"} Code>, sinon, si la liste est juste vide: {"_ID": "82125E77-A52C-4DFA-AFB7-A31560B10A9D", "Articles": []} code>. Mais lorsque je mettez la méthode suggérée, ma liste items B> n'est pas du tout sérialisée, que ce soit, il a été consulté ou non.
@Jentor quel sériologiste utilisez-vous? Beaucoup soutiennent le motif de DoSerialize *, c'est-à-dire Public Bool devrait () {Retour Items! = NULL; } code>
Une raison de choisir ?? sur paresseux
@Marcgravell depuis que j'écris l'application qui utilise mongodb, j'utilise son sérialisateur JSON natif. Et tout ce gâchis est à cause de [BSONIGNOREIFNULL] code> attribut.
@Runefs parce que cela fait le travail juste bien
@Jentor Il peut y avoir d'autres options disponibles en fonction du sérieliseur (rappels, etc.), mais une autre option simple: juste init manuellement la liste en cas de besoin. La seule façon de le faire avec une méthode d'extension serait très désordonnée et gênante.
@Runefs Il semble que j'ai juste besoin d'ajouter une nouvelle méthode additem code> dans test code> classe où je vais vérifier si ma liste est null. La raison de ne pas choisir paresseux code> est parce que objet paresseux Articles ": [] code>
@Marcgravell La liste d'initiale manuelle est un moyen le plus simple de le faire. Je veux juste le faire bien. :)
@Jentor "Nice" ici n'existe pas vraiment si vous le faites comme une méthode régulière sur le type, plutôt qu'une méthode d'extension (une méthode régulière aurait accès au champ)
la ?? APPROCHE BASÉE EST Aussi loin que je puisse voir à partir de l'IL Not Thread Safe (ne peut pas trouver de la documentation qui prouve ou ne le reproge pas). Dans ce cas particulier, ce n'est pas vraiment une question depuis que la liste
@RUNEFS En effet, il ne serait pas le thread-coffre-fort à moins que je ne synchronise, ou (peut-être préférable) utilisé interocked.careexchange code> pour l'assignation. Affichage Ensoleillé CODE> Il pourrait être assez sûr de la sécurité du thread, mais il s'agit rarement d'une exigence relative aux méthodes d'instance et a associé au-dessus de la tête b>.
Si vous utilisez .NET 4.0, vous pouvez utiliser paresseux une classe pour gérer automatiquement l'initialisation paresseuse. Votre code devient alors: Vous pouvez ensuite appeler voir initialisation paresseuse < / a> Pour plus d'informations. P> p> test.items.add code> à tout moment. Il sera initialisé lors de la première utilisation. P>
Comme je l'ai mentionné dans la réponse précédente, le pilote C # MongoDb sera sérialisé _Items code> de toute façon, même il est vide. Mais je veux obtenir tout le charme d'utiliser [bsonignoreifnull] code> attribut.
une manière plus compacte à l'aide de nouvelles fonctionnalités C #