Ich verwende Linq To XML
new XElement("Prefix", Prefix == null ? "" : Prefix)
Ich möchte jedoch einige Berechnungen für das Präfix durchführen, bevor ich es der XML-Datei hinzufüge, z. B. Leerzeichen, Sonderzeichen, einige Berechnungen usw.
Ich möchte keine Funktionen erstellen, da diese für keinen anderen Teil meines Programms hilfreich sind. Gibt es also eine Möglichkeit, Inline-Funktionen zu erstellen?
Antworten:
Ja, C # unterstützt das. Es stehen verschiedene Syntaxen zur Verfügung.
In C # 2.0 wurden anonyme Methoden hinzugefügt:
Lambdas sind neu in C # 3.0 und in zwei Geschmacksrichtungen erhältlich.
Ausdruck Lambdas:
Aussage Lambdas:
Lokale Funktionen wurden mit C # 7.0 eingeführt:
Grundsätzlich gibt es zwei verschiedene Typen für diese:
Func
undAction
.Func
s Rückgabewerte, aberAction
nicht. Der letzte Typparameter von aFunc
ist der Rückgabetyp. Alle anderen sind die Parametertypen.Es gibt ähnliche Typen mit unterschiedlichen Namen, aber die Syntax für die Inline-Deklaration ist dieselbe. Ein Beispiel hierfür ist
Comparison<T>
, was in etwa gleichbedeutend ist mitFunc<T, T, int>
.Diese können direkt aufgerufen werden, als wären sie reguläre Methoden:
quelle
C # 7 bietet Unterstützung für lokale Funktionen
Hier ist das vorherige Beispiel mit einer lokalen Funktion
quelle
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):
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:
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:
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
quelle
Ja.
Sie können anonyme Methoden oder Lambda-Ausdrücke erstellen :
quelle
code
Func <string, string> PrefixTrimmer = x => x? "";code
Ich bin neu in diesem und ich verstehe das MSDN-Dokument wirklich nicht sehr gutx ?? ""
ist der Null-Koaleszenz-Operator. msdn.microsoft.com/en-us/library/ms173224.aspxx => (something)
,x
ist ein Parameter, und(something)
ist die Rückkehr value`.Sie können Func verwenden, das eine Methode mit einem Parameter kapselt und einen Wert des vom Parameter TResult angegebenen Typs zurückgibt.
quelle
Es kann nicht nur Inside-Methoden verwenden, sondern auch innerhalb von Klassen.
quelle