138 votes

Comment créer des fonctions inline en C #

J'utilise Linq To XML

 new XElement("Prefix", Prefix == null ? "" : Prefix)
 

mais je veux faire quelques calculs sur le préfixe avant de l'ajouter au xml, comme éliminer les espaces, les caractères spéciaux, certains calculs, etc.

Je ne veux pas créer de fonctions car celles-ci ne seront d'aucune aide pour aucune autre partie de mon programme, mais est-ce qu'il y a un moyen de créer des fonctions inline?

299voto

R. Martinho Fernandes Points 96873

Oui, C# prend en charge que. Il existe plusieurs syntaxes disponibles:

  • Les méthodes anonymes (disponible à partir de C# 2 à partir)

    Func<int, int, int> add = delegate(int x, int y)
                         {
                             return x + y;
                         };
    Action<int> print = delegate(int x)
                        {
                            Console.WriteLine(x);
                        }
    Action<int> helloWorld = delegate // parameters can be elided if ignored
                             {
                                 Console.WriteLine("Hello world!");
                             }
    
  • Expression Lambda (disponible à partir de C# 3 et suivantes)

    Func<int, int, int> add = (int x, int y) => x + y; // or...
    Func<int, int, int> add = (x,y) => x + y; // types are inferred by the compiler
    
  • Déclaration des lambdas (disponible à partir de C# 3 et suivantes)

    Action<int> print = (int x) => { Console.WriteLine(x); };
    Action<int> print = x => { Console.WriteLine(x); }; // inferred types
    Func<int, int, int> add = (x,y) => { return x + y; };
    

Il existe essentiellement deux types différents pour ces: Func et Action. Funcs valeurs de retour, mais Actions n'en ont pas. Le dernier paramètre de type d'un Func est le type de retour, tous les autres sont les types de paramètres.

Il y a des types similaires avec des noms différents, mais la syntaxe pour déclarer leur inline est le même. Un exemple de ceci est Comparison<T>, ce qui est à peu près équivalent à Func<T,T,int>.

Func<string,string,int> compare1 = (l,r) => 1;
Comparison<string> compare2 = (l,r) => 1;
Comparison<string> compare3 = compare1; // this one only works from C# 4 onwards

Ceux-ci peuvent être directement invoquée comme si elles étaient des méthodes régulières:

int x = add(23,17); // x == 40
print(x); // outputs 40
helloWorld(x); // helloWord has one int parameter declared: Action<int>
               // even though it does not make any use of it.

18voto

SLaks Points 391154

Oui.

Vous pouvez créer des méthodes anonymes ou des expressions lambda :

 Func<string, string> PrefixTrimmer = delegate(string x) {
    return x ?? "";
};
Func<string, string> PrefixTrimmer = x => x ?? "";
 

6voto

Homam Points 8664

Vous pouvez utiliser Func qui encapsule une méthode qui possède un paramètre et renvoie une valeur du type spécifié par le paramètre TResult.

 void Method()
{
    Func<string,string> inlineFunction = source => 
    {
        // add your functionality here
        return source ;
     };


    // call the inline function
   inlineFunction("prefix");
}
 

1voto

AK_ Points 2169

Pas de.

Inline fonction consiste à dire au compilateur comment voulez-vous qu'il compiler le code source, vous n'avez pas le faire en C#. le compilateur va décider lui-même comment optimiser votre code.

Fonction imbriquée est quelque chose de complètement différent qui définit une fonction dans une autre. qui, par la manière en c# indique au compilateur de créer une nouvelle classe à cette fonction et à l'appeler par le biais d'un pointeur de fonction (délégué). qui performance sage serait le contraire d'une fonction en ligne.

Pour conclure, il suffit d'écrire une méthode privée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X