Können Math-Referenzen in C # verkürzt werden?

7

In VB.NET konnte ich meinen mathematischen Code viel sauberer machen, indem ich System.Math importiere und direkt auf seine Methoden referenziere:

%Vor%

Aber ich glaube nicht, dass C # Klassen verwenden kann, um implizit auf ihre Methoden zuzugreifen, also muss ich etwas tun wie:

%Vor%

Aber das ist hässlich; es braucht eine eigene Bildlaufleiste !. Gibt es eine Möglichkeit, etwas in C # zu schreiben, das wie mein VB.NET-Code aussieht? Ich könnte lokale Wrapper-Methoden für Sin und Cos schreiben, aber würde das nicht die Performance reduzieren (wegen des Overheads von Funktionsaufrufen)? Und das würde das Schreiben von Wrapper-Funktionen für jede Math-Funktion erfordern, die ich in jeder Klasse verwende, in der ich sie verwende; das ist auch nicht so wünschenswert.

    
Ben 19.06.2012, 19:06
quelle

7 Antworten

12

Sie könnten System.Math mit der using-Direktive einen Alias ​​geben:

%Vor%

Das ist das Beste, was ich habe.

  

Ich könnte lokale Wrapper-Methoden für Sin und Cos schreiben, aber würde das nicht die Performance reduzieren (wegen des Overheads von Funktionsaufrufen)?

Sie könnten, und an diesem Punkt könnten Sie Generika und andere Feinheiten verwenden, um es noch bequemer zu machen, aber Sie würden immer noch auf eine solche Bibliothek verweisen, es sei denn, die ganze Mathematik würde in der gleichen Klasse passieren, in der dieser Code vorkommt als Methoden.

Die Frage nach "Performance from Overhead" wird beantwortet mit "zusätzlichen Stack-Frames für so etwas Einfaches sind für Standardanwendungen nicht auffällig". Wenn Sie in einer engen Schleife wären, dann wäre das ein Problem.

    
jcolebrand 19.06.2012, 19:07
quelle
9

Ab C # 6.0 können Sie die mathematischen Referenzen verkürzen, indem Sie eine using static Deklaration hinzufügen:

%Vor%

Damit können Sie statische Member vom Typ Math verwenden, ohne sie mit dem Typnamen zu versehen:

%Vor%

Es gibt keine Möglichkeit, dies "global" zu tun, da es derzeit keine Möglichkeit gibt, eine using-Deklaration global anzuwenden.

Für diejenigen, die nicht C # 6 verwenden

  

Aber würde das nicht die Performance reduzieren (wegen des Overheads von Funktionsaufrufen)?

Ich würde mir keine Sorgen machen. Schreiben Sie zuerst Ihren Code als lesbar . Wir können die Methode auf verschiedene Arten schreiben. Die erste ist, einfach Leerraum hinzuzufügen:

%Vor%

Sie können das auch in eine Hilfsmethode einfügen.

jcolebrands Antwort ist eine nette Sache, das auch zu tun, aber es erfordert das Hinzufügen von using m = System.Math; überall.

    
vcsjones 19.06.2012 19:08
quelle
7
  

Aber das ist hässlich; Es benötigt eine eigene Bildlaufleiste!

Ja, bei Stapelüberlauf, der eine kurze Breite hat. Sie müssen es stattdessen auf mehrere Zeilen setzen:

%Vor%

Ich persönlich denke, dass auf jeden Fall besser lesbar ist, weil jetzt die drei verschiedenen Werte klarer differenziert sind. Eine Leerzeile ist ein klarer Trennzeichen als nur ein Komma, IMO. Wenn Sie mehrere Argumente haben, die so ähnlich sind, dass sie zusammen verloren gehen können, verwenden Sie mehrere Zeilen zur besseren Übersicht.

Ja, es wäre irgendwie schön, wenn Sie einfach Sin(az) etc schreiben könnten - aber es gibt nichts in C #, das Ihnen das erlauben würde, also würde ich den Code immer neu formatieren zur besseren Lesbarkeit.

    
Jon Skeet 19.06.2012 19:11
quelle
7

Sie können

hinzufügen %Vor%

und dann mach einfach

%Vor%

aber .... Ich sehe den wirklichen Wert nicht

Tatsächlich sollte jede dieser Variablen mit besseren Namen gespeichert werden, um darzustellen, was sie sind. Wenn ich das ansehe, sehe ich nicht, was getan wird.

%Vor%

Oder besser, was sind die drei Parameter, die von Vector3 eigentlich aufgerufen werden?

%Vor%

Das würde die Lesbarkeit GROSS verbessern, da die nächste Person besser verstehen würde, was die Formel ist.

    
CaffGeek 19.06.2012 19:09
quelle
5

Sie können eine Klasse erstellen, die die Aufrufe als Erweiterungsmethoden umschließt:

%Vor%

Der Compiler sollte diese Aufrufe in Zeilen einfügen, damit sich die Performance nicht wirklich unterscheidet.

    
Lucero 19.06.2012 19:12
quelle
1

Sie können auch Erweiterungsmethoden verwenden, aber das Ergebnis wird unnatürlicher aussehen (mit einem möglichen zusätzlichen Funktionsaufruf, auch wenn es wahrscheinlich weggestrichen ist):

%Vor%

Und benutze:

%Vor%     
Alexei Levenkov 19.06.2012 19:13
quelle
0

Sie können keinen Alias ​​für die Methode in C # definieren, nur für eine Klasse.

    
Ribtoks 19.06.2012 19:09
quelle

Tags und Links