C # 4.0 dynamisch: Eine mögliche performante Lösung für numerische Generika?

8

Nachdem ich selbst auf dieses Problem gestoßen bin und versucht habe, ein generisches Vector2<int/float/double> in C # zu implementieren, habe ich eine Reihe von Untersuchungen zu diesem Problem durchgeführt, die auch in dieser Frage beschrieben sind:

Weniger generische Generika? Eine mögliche Lösung für die Arithmetik in C # Generika

Diese Links enthalten weitere Hintergrundinformationen und faszinierende Lösungsansätze:

Ссылка

Ссылка

Nun, da C # 4.0 mit seinem neuen vielseitigen dynamic -Typ herauskommt, ist meine Frage für die brillante SO-Community: Ist es ein Tool, das vielleicht verwendet werden könnte, um leistungsfähige, generische Vektor / Matrix / etc. numerische Typen?

Es ist klar, dass ein Vektor2 einfach wie folgt aufgebaut werden kann:

%Vor%

Aber mit diesem Ansatz haben wir hier keine Typenzwangsbeschränkung, also könntest du Vector2(3, 12.4572) machen. Gibt es eine Möglichkeit, dynamische Elemente mit einem Typparameter Vector2<int> zu mischen, um unsere mathematischen Operationen auszuführen, wie dies mit int s geschehen würde?

Vielleicht könnte eine Art Casting verwendet werden, um sicherzustellen, dass this.X ein T ist, obwohl ich nicht weiß, wie das funktionieren würde.

    
Collin Arnold 16.02.2011, 07:58
quelle

1 Antwort

7

Nur Sie können feststellen, ob dynamische Operatoraufrufe Ihre Leistungsanforderungen erfüllen, aber es ist sicherlich möglich, einige Ihrer Typsicherheitsaspekte mit Generika zu behandeln - es gibt keinen Grund, dass alles überprüft werden muss Laufzeit nur wegen eines kleinen dynamischen Aufrufs:

%Vor%

Die einzige gefährliche Operation besteht nun darin, zwei Vektoren des gleichen Typs hinzuzufügen (der Additionsoperator muss wie erwartet mit dem Argument "type" arbeiten), aber alles andere ist vollkommen typsicher , so wie es sein sollte. Sie können new Vector<int>("a", 5) nicht ausführen, einen Vector<int> und einen Vector<string> hinzufügen oder den Zusatz von zwei Vector<int> s einem Vector<string> zuweisen. Beachten Sie, dass keiner dieser Fehler bei der Kompilierung mit Ihrer ursprünglichen Lösung abgefangen wurde.

Beachten Sie Folgendes:

  1. Es gibt nichts, was Sie davon abhalten könnte, generics hier zu verwenden, aber geht die kompilierende-eine-Ausdruck-Baumroute für die Addition anstatt dynamic durch. Delegataufrufe sind nicht frei, aber sie sollten theoretisch in diesem Fall schneller sein als der dynamic -Ansatz - zumindest vermeiden Sie das Boxen von Werttypen. Nur Sie können feststellen, ob sie schnell genug sind .

  2. Ziehen Sie in jedem Fall in Erwägung, einen statischen Konstruktor zu schreiben, der validiert, dass das Typ-Argument tatsächlich einen geeigneten Additionsoperator hat, so dass Typfehler früh im Spiel auftreten.

BEARBEITEN (OP ist nicht zufrieden mit der Leistung von dynamic hier):

Der Ausdruck-Baum-Ansatz würde etwa so aussehen:

%Vor%     
Ani 16.02.2011, 08:02
quelle