dans les modèles C ++ ont la fonctionnalité que vous pouvez transmettre une valeur comme argument sur Modèle d'une fonction . Comment puis-je faire la même chose en C #?
Par exemple, je veux faire quelque chose de similaire à celui suivant: p> mais en C #. Comment puis-je faire cela? P> Au fait, ma nécessité réelle d'eux implique de générer des classes à la demande (avec quelques valeurs statiques modifiées), le code présenté n'est qu'un exemple. P> < / p>
3 Réponses :
C # Les génériques ne sont pas comme des modèles C ++ de cette façon. Ils ne fonctionnent que avec des types et non des valeurs. P>
@pretobomba Vous pouvez simplement écrire factorial comme une fonction récursive.
Hehehe, mon besoin réel d'entre eux implique de générer des classes à la demande (avec quelques valeurs statiques modifiées). Une fonction récursive fonctionne pour l'exemple que j'ai donné, mais ce n'est pas une solution de contournement complète des limites des génériques.
mon besoin réel d'entre eux implique de générer des classes à la demande (avec quelques valeurs statiques modifiées) i> - Est-ce votre problème réel ou une solution à un autre problème qui peut être approché différemment dans C #?
@pretobomba Veuillez élaborer votre question spécifique.
C'est mon problème réel
MSDN.MicRosoft.com/en-us/Library/c6cyy67b.aspx est une très bonne explication.
@pretobomba: Les valeurs statiques ne sont partagées que par des instances de la même version de la classe générique, non par la classe entière. En tant que tel, vous pouvez utiliser une sorte de méthode d'usine ou d'initialisation pour définir ces valeurs statiques et obtenir un résultat similaire. Ou utilisez simplement des champs réguliers et gérer la légère surcharge.
@ Daniela.white Comment peut-on un en C # d'atteindre le même effet que de transmettre une valeur à un modèle en C ++?
Référence pour ce que j'ai dit ci-dessus: Stackoverflow.com/Questtions/9647641/...
@siride pourriez-vous élaborer sur l'approche d'usine? Je ne suis pas tout à fait de ça.
@pretobomba: Cela dépend vraiment de ce que vous essayez de faire. Mon idée de l'approche d'usine était d'avoir une autre classe créer des instances de vos objets génériques et que cette usine pourrait gérer des détails comme la configuration de champs statiques.
mais en c #. Comment puis-je faire cela? P>
Au fait, mon besoin réel d'entre eux implique de générer des classes à la demande (avec quelques valeurs statiques modifiées), le code présenté n'est qu'un exemple. p> blockQuote>
comme Daniel a expliqué , ce n'est pas possible via des génériques. p>
Une alternative potentielle consiste à utiliser T4 Modèles . Selon vos besoins, vous pouvez potentiellement générer vos classes basée sur les modèles au moment de la compilation, ce qui semble que cela pourrait répondre à vos besoins. P>
Vous essayez de rendre le compilateur faire des choses que votre code devrait faire au moment de l'exécution.
Oui, cela est possible en C ++. En C #, ce n'est pas le cas. L'équivalent de votre code en C # serait: p> Notez que, tandis que le code statique est déjà une mauvaise violation du principe de l'OOP (mais parfois nécessaire), en utilisant la valeur basée sur la valeur Les modèles sont encore pires. Vos types doivent dépendre des autres types, ce qui est possible en utilisant des génériques. Ils ne doivent pas dépendre de valeurs concrètes. P> p>
Est-ce équivalent aux méthodes génériques? Je n'ai aucune idée de C ++ que ce soit.
Non, les modèles permettent de transmettre des valeurs, tandis que les génériques n'autorisent que les types. Je cherche une solution de contournement pour obtenir le même effet des valeurs de passage que les paramètres de modèle, mais en C # (où cela n'est pas autorisé)
Je ne vois pas comment cela est utile dans une approche orientée objet.
Pouvez-vous être plus précis sur les classes que vous voulez générer et pourquoi?
La génération de cours peut être effectuée en C # /. Net via EMIT ou CODE DOM (Liens Stackoverflow.com/questions/7769287/... ) ... Mais si vous spécifiez votre problème réel ("comme Clone Unity Intercepteurs"), il pourrait y avoir d'autres approches.
Veuillez également fournir un échantillon proche de ce que vous voulez, car la factorielle probablement mieux résolue par Mémoisation , ou des problèmes similaires peuvent être résolus par Currying A> ...