Gibt es einen Grund, C# unterstützt keine manuelle inline-Methoden?Und was ist mit optionalen Parametern?

StackOverflow https://stackoverflow.com/questions/1621623

  •  06-07-2019
  •  | 
  •  

Frage

Gibt es irgendwelche design Grund, der(wie der Grund Gaben Sie bis multi-Erbe)?

oder es war einfach nicht wichtig genug?

und die gleiche Frage gilt für den optionalen Parameter in Methoden...dies war bereits in der ersten version vb.net...so ist es sicherlich keine Faulheit, die Ursache von MS nicht zu erlauben, optionale Parameter, wahrscheinlich architecture Entscheidung..und es scheint, Sie hatten änderung des Herzens über, dass, da C# 4 ist noch, dass..

Weiß jemand, was war die Entscheidung und warum haben Sie es aufgeben?

EDIT:

Sie vielleicht nicht vollständig verstehen mich.Ich arbeite in letzter Zeit an einem Programm für die Berechnung (Unterstützung zahlen beliebiger Größe, um die Letzte Ziffer), in denen einige Methoden, die verwendet werden buchstäblich Millionen von mal pro Sekunde.

Sagen, ich habe eine Methode namens Add(int num), und diese Methode wird sehr viel ruhiger, mit 1 als parameter (Add(1);), Ich habe herausgefunden, es ist schneller zu implementieren, die eine Besondere Methode, die vor allem für eins.Und ich meine nicht überladen Schreiben eine neue Methode namens AddOne, und buchstäblich kopieren Sie die Add-Methode in Ihr ist, außer dass anstelle der Verwendung num Ich Schreibe 1.Dies könnte scheint erschreckend komisch für Sie, aber es tatsächlich schneller.

(so viel wie hässlich es ist)

Das machte mich Frage mich, warum C# unterstützt keine manuelle inline-was kann erstaunlich hilfreich hier.

vielen Dank.(und warum hat Sie Ihre Stimme mit mir down :S)

Edit 2:

Ich fragte mich, ob oder nicht, um das hinzuzufügen.Ich bin sehr gut vertraut mit der Skurrilität (und Nachteile) von der Wahl einer Plattform wie dot net für ein solches Projekt, aber ich denke, dot net Optimierungen sind wichtiger als Sie denken...vor allem features wie CPU, etc.

War es hilfreich?

Lösung

Antwort Teil Ihrer Frage finden Sie unter Eric Gunnerson ' s blog post: Warum nicht C# verfügen über eine "inline' keyword?

Ein Zitat aus seinem post:

Für C#, inlining passiert an den JIT Ebene, und die JIT-in der Regel macht eine anständige Entscheidung.

EDIT:Ich bin nicht sicher, der Grund für die verzögerte optionale Parameter unterstützen, sich jedoch sagen, dass Sie "aufgegeben" und es klingt, als ob Sie erwartet wurden, um es zu implementieren, basierend auf unsere Erwartungen, was anderen Sprachen angeboten.Ich vorstellen, es war nicht hoch auf Ihrer Prioritätenliste und Sie hatten sich die Fristen um bestimmte Funktionen aus der Tür, für jede version.Er wußte wohl nicht, Anstieg der Bedeutung bis jetzt, vor allem, da die Methode überladen war eine verfügbare alternative.In der Zwischenzeit bekamen wir Generika (2.0), und den Funktionen, die machen LINQ möglich etc.(3.0).Ich bin glücklich mit dem Fortschreiten der Sprache;die genannten Merkmale sind wichtiger für mich, als erste Unterstützung für optionale Parameter früh auf.

Andere Tipps

Manuelles inlining wäre fast nutzlos.Der JIT-compiler inlines-Methoden während der native code compilation, wo angemessen, und ich denke, dass in fast allen Fällen wird der JIT-compiler ist besser, zu erraten, Wann es angebracht ist, als die Programmierer.

Als optionalen Parameter, ich weiß nicht, warum Sie nicht da waren, die in früheren Versionen.Das heißt, ich weiß nicht, wie Sie es in C# 4, denn ich betrachte Sie eher schädlich, weil Sie den parameter gebacken bekommen in den Konsum Montage-und Sie müssen es neu kompilieren, wenn Sie ändern Sie die standard-Werte, die in einer DLL und wollen den Konsum-assembly zu verwenden, die neue.

EDIT:

Einige zusätzliche Informationen über das inlining.Obwohl Sie nicht die Kraft der JIT-compiler die inline-Methode aufrufen, können Sie erzwingen, dass es NICHT inline-Methode aufrufen.Für diese, Sie verwenden das System.Laufzeit.CompilerServices.MethodImplAttribute, etwa so:

internal static class MyClass
{
    [System.Runtime.CompilerServices.MethodImplAttribute(MethodImplOptions.NoInlining)]
    private static void MyMethod()
    {
        //Powerful, magical code
    }

    //Other code
}

Meine Vermutung:der Grund früheren Versionen von C# nicht über optionale Parameter ist wegen der schlechten Erfahrungen, die mit Ihnen in C++.Auf der Oberfläche, Sie sehen auch geradlinig genug, aber es gibt ein paar lästige Ecke Fälle.Ich denke, einer von Herb Sutter ' s Bücher beschreibt diese im detail;in Allgemeinen, es hat zu tun mit übergeordneten virtual Methoden. Maximilian hat erwähnt, dass man von der .NETTO-Ecke-Fälle in seiner Antwort.

Sie können auch ziemlich viel erhalten, indem Sie durch manuelles schreiben mehrere überladungen;das mag nicht sehr schön für den Autor der Klasse, aber die Kunden werden kaum bemerken den Unterschied zwischen überlastung und optionale Parameter.

So nach all den Jahren, w/o Ihnen, warum C# 4.0 hinzufügen?1) bessere Parität mit VB.NET und 2) leichter interop-COM.

Ich arbeite in letzter Zeit an einem Programm für die Berechnung (Unterstützung zahlen beliebiger Größe, um die Letzte Ziffer), in denen einige Methoden, die verwendet werden buchstäblich Millionen von mal pro Sekunde.

Dann wählen Sie eine falsche Sprache.Ich nehme an, Sie tatsächlich profiliert Ihr code (oder?) und wissen, dass es nichts gibt, abgesehen von Mikro-Optimierungen, die Ihnen helfen können.Auch, Sie sind mit einem high-performance native bigint-Bibliothek und beim schreiben Ihrer eigenen, richtig?

Wenn das wahr ist, nicht verwenden .NET.Wenn Sie denken, dass Sie gewinnen können, die Geschwindigkeit auf teilweise Spezialisierung, gehen Sie zu Haskell, C, Fortran oder einer anderen Sprache, das entweder automatisch, oder Sie können setzen inlining, um Sie zu tun es durch hand.

Wenn Add(1) wirklich wichtig ist, heap-Zuweisungen Rolle zu.

Sie sollten jedoch wirklich zu schauen, was der profiler kann Ihnen sagen...

C# hat Hinzugefügt, dass Sie in 4.0: http://msdn.microsoft.com/en-us/library/dd264739(VS.100).aspx

Warum waren Sie nicht fertig, von Anfang an, seine wahrscheinlich, weil Sie der Meinung Methode überlastungen gab mehr Flexibilität.Bei überlastung können Sie mehrere 'defaults' auf der Basis der anderen Parameter, die Sie einnehmen.Ihr auch nicht, dass viel mehr syntax.

Auch in Sprachen wie C++, inlining etwas nicht garantieren, dass es geschehen werde;es ist ein Hinweis an den compiler. Der compiler kann entweder den Hinweis, oder tun Sie Ihre eigene Sache.

C# ist ein weiterer Schritt entfernt von den generierten Assembler-code (per IL + JIT), also es wird noch schwieriger zu garantieren, dass etwas inline.Darüber hinaus haben Sie Themen wie die x86 + x64 Implementierungen des JIT, die sich in Verhalten.

Java beinhaltet keinen inline Stichwort entweder.Das bessere Java-JITs können inline-auch virtuelle-Methoden, noch die Verwendung von Schlüsselwörtern wie private oder final einen Unterschied machen (es verwendet, um, aber das ist jetzt alte Geschichte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top