12
votes

en utilisant le rendement en C # comme je le ferais dans Ruby

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
}

...


0 commentaires

5 Réponses :


19
votes

Ce que vous voulez sont des expressions de Lambda, quelque chose comme: xxx

ceci capture t de la même manière rendement dans Ruby. Le rendement C # est différent, il construit des générateurs pouvant être itératés sur.


2 commentaires

C'est fou! Fonctionne parfaitement, cependant. J'ai peut-être vu action avant, mais je n'ai jamais su son utilisation. Merci!


action avec Func 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).



0
votes

rendement in c # est spécifiquement pour le retour des bits d'une collection itératée. Spécifiquement, votre fonction doit renvoyer iEnumerable ou ienumerable pour rendement pour fonctionner, et il est destiné à être utilisé à l'intérieur d'un < Code> foreach 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.

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.


0 commentaires

0
votes

Vous pouvez avoir Betttement Prendre un délégué contenant le code à exécuter, puis transmettre des méthodes anonymes à partir d'autres fonctions.


0 commentaires

1
votes

Je pourrais passer un délégué à l'itérateur. XXX


1 commentaires

Notez que votre définition de action est défectueuse, elle doit accepter un paramètre.



7
votes

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 # 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>

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> xxx pré>

Utilisez-la comme: p> xxx pré>

L'équivalent rubis serait Quelque chose comme: p> xxx pré>

in c #, 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>

en fait, dans Ruby, Rendement Code> est juste un raccourci pour PROC # appel code>. p>

Imagine, si rendement code> n'a pas existé. Comment écririez-vous un si code> méthode de ruby? Cela ressemblerait à ceci: p> xxx pré>

C'est une sorte de lycée. Dans Ruby 1.9, nous obtenons des littéraux Proc et une syntaxe de raccourci pour 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); })


0 commentaires