En plus d'utiliser code> de rendement code> pour les itérateurs de Ruby, je l'utilise également pour réussir le contrôle brièvement à l'appelant avant de reprendre le contrôle dans la méthode appelée. Ce que je veux faire en C # est similaire. Dans une classe de test, je souhaite obtenir une instance de connexion, créer une autre instance de variable utilisant cette connexion, puis transmettez la variable à la méthode d'appel afin qu'elle puisse être traitée. Je veux ensuite le contrôle de revenir à la méthode appelée afin que la connexion puisse être disposée. Je suppose que je veux un bloc / fermeture comme dans Ruby. Voici l'idée générale:
private static MyThing getThing()
{
using (var connection = new Connection())
{
yield return new MyThing(connection);
}
}
[TestMethod]
public void MyTest1()
{
// call getThing(), use yielded MyThing, control returns to getThing()
// for disposal
}
[TestMethod]
public void MyTest2()
{
// call getThing(), use yielded MyThing, control returns to getThing()
// for disposal
}
...
5 Réponses :
Ce que vous voulez sont des expressions de Lambda, quelque chose comme: ceci capture t code> de la même manière rendement code> dans Ruby. Le rendement C # code> est différent, il construit des générateurs pouvant être itératés sur. P> p>
C'est fou! Fonctionne parfaitement, cependant. J'ai peut-être vu action code> avant, mais je n'ai jamais su son utilisation. Merci!
action code> avec Func code> est la colle qui maintient Linq ensemble, ils sont conçus pour représenter n'importe quelle expression de Lambda (jusqu'à 12 ou deux paramètres que je crois).
Je ne suis pas sûr du sommet de ma tête s'il y a une autre construction que vous pourriez utiliser ou non, éventuellement quelque chose avec des expressions Lambda. P> rendement code> in c # est spécifiquement pour le retour des bits d'une collection itératée. Spécifiquement, votre fonction doit renvoyer iEnumerable ienumerable code> pour rendement code> pour fonctionner, et il est destiné à être utilisé à l'intérieur d'un < Code> foreach code> boucle. C'est une construction très spécifique en C #, et elle ne peut pas être utilisée dans la façon dont vous essayez. P>
Vous pouvez avoir Betttement code> Prendre un délégué contenant le code à exécuter, puis transmettre des méthodes anonymes à partir d'autres fonctions. P>
Je pourrais passer un délégué à l'itérateur.
Notez que votre définition de action code> est défectueuse, elle doit accepter un paramètre.
Vous dites que vous souhaitez utiliser le mot clé code> de c # 's code> de la même manière que vous utiliseriez le mot-clé code> de Ruby's CODE>. Vous semblez être un peu confus sur ce que les deux font réellement: les deux ont absolument rien em> à faire les uns avec les autres, ce que vous demandez, n'est tout simplement pas possible. Le C # iow, c'est pour retourner l'élément suivant d'un itérateur. Voici un exemple abrégé de la documentation de MSDN officielle: p> Utilisez-la comme: p> L'équivalent rubis serait Quelque chose comme: p> in c #, en fait, dans Ruby, Imagine, si C'est une sorte de lycée. Dans Ruby 1.9, nous obtenons des littéraux Proc et une syntaxe de raccourci pour Rendement Code> Le mot-clé est pas em> l'équivalent C # de la rubis Rendement code> mot-clé. En fait, il n'est pas un em> équivalent au rendement RUBY (code> mot-clé en C #. Et l'équivalent rubis sur c # 's le mot clé code> est pas em> le rendement code> mot-clé em>, c'est le énumérateur :: Yielder # Rendement code> méthode em> (également aliasé comme énumérateur :: Yielder # ). P> rendement code> est utilisé pour donner une valeur em> à l'appelant em> et dans ruby, rendement code> est utilisé pour générer contrôle em> à un argument block p> Rendement Code> est juste un raccourci pour PROC # appel code>. p> rendement code> n'a pas existé. Comment écririez-vous un si code> méthode de ruby? Cela ressemblerait à ceci: p> PROC # Call CODE>, ce qui en fait un peu plus agréable: P> void Foo(Action<string> bar) => bar("StackOverflow")
Foo(name => { Console.WriteLine("Higher-order Hello World from {0]!", name); })