Die Antwort auf Ihre Frage lautet Ja und Nein, je nachdem, was Sie unter "Inline-Funktion" verstehen. Wenn Sie den Begriff wie in der C ++ - Entwicklung verwenden, lautet die Antwort Nein, das können Sie nicht - selbst ein Lambda-Ausdruck ist ein Funktionsaufruf. Zwar können Sie Inline-Lambda-Ausdrücke definieren, um Funktionsdeklarationen in C # zu ersetzen, doch der Compiler erstellt dennoch eine anonyme Funktion.
Hier ist ein wirklich einfacher Code, mit dem ich dies getestet habe (VS2015):
static void Main(string[] args)
{
Func<int, int> incr = a => a + 1;
Console.WriteLine($"P1 = {incr(5)}");
}
Was generiert der Compiler? Ich habe ein nützliches Tool namens ILSpy verwendet, das die tatsächlich generierte IL-Assembly anzeigt. Schauen Sie mal rein (ich habe viele Sachen zum Einrichten von Klassen weggelassen)
Dies ist die Hauptfunktion:
IL_001f: stloc.0
IL_0020: ldstr "P1 = {0}"
IL_0025: ldloc.0
IL_0026: ldc.i4.5
IL_0027: callvirt instance !1 class [mscorlib]System.Func`2<int32, int32>::Invoke(!0)
IL_002c: box [mscorlib]System.Int32
IL_0031: call string [mscorlib]System.String::Format(string, object)
IL_0036: call void [mscorlib]System.Console::WriteLine(string)
IL_003b: ret
Sehen Sie diese Zeilen IL_0026 und IL_0027? Diese beiden Anweisungen laden die Nummer 5 und rufen eine Funktion auf. Dann formatieren und drucken IL_0031 und IL_0036 das Ergebnis.
Und hier ist die Funktion namens:
.method assembly hidebysig
instance int32 '<Main>b__0_0' (
int32 a
) cil managed
{
// Method begins at RVA 0x20ac
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4.1
IL_0002: add
IL_0003: ret
} // end of method '<>c'::'<Main>b__0_0'
Es ist eine sehr kurze Funktion, aber es ist eine Funktion.
Lohnt sich die Optimierung? Nein, nein. Wenn Sie es tausende Male pro Sekunde aufrufen, aber wenn die Leistung so wichtig ist, sollten Sie in Betracht ziehen, nativen Code aufzurufen, der in C / C ++ geschrieben ist, um die Arbeit zu erledigen.
Nach meiner Erfahrung sind Lesbarkeit und Wartbarkeit fast immer wichtiger als die Optimierung für einige Mikrosekunden Geschwindigkeitsgewinn. Verwenden Sie Funktionen, um Ihren Code lesbar zu machen und den Gültigkeitsbereich von Variablen zu steuern, und sorgen Sie sich nicht um die Leistung.
"Vorzeitige Optimierung ist die Wurzel allen Übels (oder zumindest des größten Teils davon) in der Programmierung." - Donald Knuth
"Ein Programm, das nicht richtig läuft, muss nicht schnell laufen" - Ich