8
votes

Comment allialiser paresseux la liste générique via une extension de classe

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?


0 commentaires

3 Réponses :


8
votes

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 , et pour être honnête, il n'y a pas de moyen pratique d'obtenir Accédez aux Get et SET SANS SANS VERBOSE, ou en utilisant beaucoup de réflexion / Expression Code. Imo juste le faire dans la classe: xxx

Cela initialisera automatiquement et attribuera la liste la première fois qu'elle est accessible.

Il ne serait pas thread-coffre-fort à moins que Je synchis ou (peut-être préférable) utilisé interocked.careexchange  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 a associé au-dessus de la tête


13 commentaires

Mais non seulement vals-éléments sont clonés dans une méthode? Je pensais que nous devrions utiliser ref ou out 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"} , sinon, si la liste est juste vide: {"_ID": "82125E77-A52C-4DFA-AFB7-A31560B10A9D", "Articles": []} . Mais lorsque je mettez la méthode suggérée, ma liste items 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; }


Une raison de choisir ?? sur paresseux ou juste hors d'habitude?


@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] 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 dans test classe où je vais vérifier si ma liste est null. La raison de ne pas choisir paresseux est parce que objet paresseux n'est toujours pas null, même sa valeur n'a pas été utilisée du tout, il est donc sérialisé de toute façon comme Articles ": []


@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 Les membres de l'instance ne sont pas en sécurité. Ma question était donc de voir s'il y avait des arguments similaires où ?? résout les problèmes paresseux crée qui vous a fait choisir ?? sur paresseux


@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 pour l'assignation. Affichage Ensoleillé 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 .




0
votes

une manière plus compacte à l'aide de nouvelles fonctionnalités C # xxx


0 commentaires