10
votes

C # équivalent pour les macros C ++ et en utilisant Auto <> Propriétés

J'ai du code d'instanciation automatique que j'aimerais postuler à environ 15 propriétés dans une classe assez grande. Le code est similaire au type suivant, mais le type est différent pour chaque instance: xxx

pour la répéter en C ++ (comme il y a ~ 15 instances), je voudrais ont utilisé un le préprocesseur macro mais je remarque que c # ne les prend pas en charge.

Je me demande si quelqu'un a une recommandation sur la façon de faire de la manière proprement en C #?


0 commentaires

7 Réponses :


22
votes

Cela pourrait rendre les choses un peu plus neutrale, vous pouvez ajouter cette méthode pour introduire une certaine réutilisation:

protected ComplexType _propertyName;
public ComplexType PropertyName
{
    get
    {
        return GetProperty(ref _propertyName);
    }
}
.
.
private T GetProperty<T>(ref T property) where T : new()
{
  if (property == null)
    property = new T();
  return property;
}


0 commentaires

6
votes

Même si cela ne résout pas directement votre problème, vous pouvez consulter le nouveau paresseux classe qui est livré avec .NET 4.0. Il est spécialement conçu pour les scénarios d'initialisation paresseux.


0 commentaires

16
votes

Vous pouvez utiliser l'opérateur ?? pour simplifier le code dans une ligne: xxx

comme une note latérale, je n'éviterais probablement pas les champs protégés. Si vous devez définir la propriété d'une classe dérivée, je préférerais créer un seigter protégé.


4 commentaires

De mon expérience en C ++, j'ai généralement trouvé tout la mise en place de «protégé» sur «Private» pour devenir un meilleur déménagement si vous souhaitez future votre application sans renoncer à la protection des membres. J'utilise rarement privé.


@Kelix: Mais vous abandonnez la protection des membres en faisant des champs protégés. Maintenant, toute classe dérivée a un accès complet à vos champs. Ceci est quelque peu similaire à avoir des champs publics, sauf que seules les classes dérivées et toutes les classes ne peuvent pas accéder aux champs.


@Martin: Oui c'est l'effet souhaité. À moins que je ne souhaite pas explicitement permettre l'accès dans des classes dérivées, je le marquerai comme «protégé». En règle générale, si vous allez faire l'effort de dériver une classe, vous voulez ajouter ou modifier le comportement de toute façon de toute façon et donc pourquoi ne pas fournir un accès illimité à le faire? Évidemment, s'il s'agissait d'une interface accessible au public (comme une bibliothèque de classe), alors «privé» serait bien mieux adapté. Je n'aime tout simplement pas restreindre l'accès là où ce n'est pas nécessaire.


@Kelix - vous l'avez à l'envers. Vous devriez penser "Je n'aime pas permettre l'accès où il n'est pas nécessaire".



11
votes

Vous pouvez faire une structure générique qui gère la création paresseuse: xxx


4 commentaires

J'utiliserais à l'aide d'une structure générique pour éviter d'avoir plus d'objets créés sur le tas.


Que se passe-t-il quand t est une structure? NOUVELLE () NE PAS RÉGLANT SANS SOIT ET AFAIK STRESS PEUT ÊTRE NULL. :)


@RYTMIS: Pour gérer les structures, il faudrait avoir un drapeau distinct indiqué si la valeur a été créée ou non, mais une inïvaison paresseuse pour les structures semble généralement être un mauvais choix de conception ... Je vais ajouter une contrainte pour que cela puisse être utilisé uniquement avec des types de référence.


@Ian: Bon point, j'ai déterré une structure générique très similaire dans notre bibliothèque comme référence, et cela ne devrait pas être un problème de changement de classe dans une structure. Je l'ai écrit comme une classe car les structures sont généralement plus compliquées à mettre en œuvre correctement.



2
votes

Vous pouvez utiliser le beaucoup plus négligé T4 (modèle de texte Toolkit de transformation) pour générer le code. C'est inclus avec Visual Studio 2008.

Il y avait un épisode 2009-06 .NET Rocks à ce sujet: " Peter Vogel utilise la génération de code " . < / p>


0 commentaires

0
votes

Essayez d'utiliser HASHTABLE ou Dictionnaire pour regrouper toutes les propriétés. Quelque chose comme ceci: xxx


0 commentaires

1
votes

Vous pouvez mettre en œuvre une initialisation paresseuse d'une manière similaire à celle-ci: xxx

qui vous permettrait d'écrire du code comme celui-ci: xxx

Les spécificités de l'initialisation sont hors de propos, je l'ai écrit comme celle-ci montrant que vous pouvez le rendre convertible de manière transparente à la version non paresseuse et effectuer l'initialisation de la première conversion. :)


0 commentaires