Macht das C # 4.0-Schlüsselwort "dynamic" Generics überflüssig?

8

Ich bin sehr gespannt auf die dynamischen Funktionen in C # ( dynamisches Keyword C # 4 - warum? nicht? ), vor allem, weil ich in bestimmten Teilen der Bibliothek meines Codes viel Reflexion verwende.

Meine Frage ist zweifach:

1. ersetzt "dynamic" Generics wie im folgenden Fall?

Generics-Methode:

%Vor%

dynamische Methode (??):

%Vor%

2. erlaubt "dynamic" nun Methoden, anonyme Typen zurückzugeben, wie im folgenden Fall?:

%Vor%

cool, Prost

BEARBEITEN:

Nachdem ich meine Frage ein wenig genauer durchdacht habe, und angesichts der Antworten, sehe ich, dass ich die generische / dynamische Hauptfrage völlig durcheinander gebracht habe. Sie sind in der Tat völlig anders. Also ja, danke für alle Infos.

Was ist aber mit Punkt 2?

    
andy 06.05.2009, 06:36
quelle

5 Antworten

16

dynamic kann eine begrenzte Anzahl von Reflexionsszenarien vereinfachen (wo Sie den Mitgliedsnamen im Voraus kennen, aber es gibt keine Schnittstelle) - insbesondere könnte es bei generischen Operatoren helfen ( obwohl andere Antworten vorhanden sind ) - aber abgesehen von den generischen Operatoren gibt es wenig Überschneidungen mit Generika.

Mit Generics können Sie (zur Kompilierzeit) wissen, mit welchem ​​Typ Sie arbeiten - umgekehrt interessiert sich dynamic nicht für den Typ . Insbesondere - Generika ermöglichen Ihnen, eine Reihe von Bedingungen über für einen Typ anzugeben und zu beweisen - d. H., Es kann eine Schnittstelle implementieren oder einen öffentlichen parameterlosen Konstruktor haben. dynamic hilft auch nicht mit: es unterstützt keine Schnittstellen, und schlimmer als einfach keine Schnittstellen zu haben, bedeutet das, dass wir explizite Schnittstellenimplementierungen mit dynamic nicht sehen können .

Außerdem ist dynamic wirklich ein Spezialfall von object , also kommt das Boxen ins Spiel, aber mit einer Rache.

In Wirklichkeit sollten Sie Ihre Verwendung von dynamic auf einige wenige Fälle beschränken:

  • COM-Interop
  • DLR-Interop
  • vielleicht etwas Licht Ente tippen
  • vielleicht einige generische Operatoren

Für alle anderen Fälle sind Generika und normale C # der richtige Weg.

    
Marc Gravell 06.05.2009, 07:18
quelle
16

Um Ihre Frage zu beantworten. Nein.

  • Generics gibt Ihnen " Wiederverwendung von Algorithmen " - Sie schreiben Code unabhängig von einem Datentyp. Das dynamic-Schlüsselwort tut nichts damit zu tun. Ich definiere List<T> und kann sie dann für die Liste der Strings, Ints usw. verwenden.
  • Geben Sie Sicherheit ein : Die gesamte Kompilierzeitüberprüfungsdebatte. Dynamische Variablen werden Sie nicht mit Kompilierungswarnungen / Fehlern warnen, falls Sie einen Fehler machen, dass sie zur Laufzeit in die Luft gehen, wenn die Methode, die Sie aufrufen wollen, fehlt. Statische vs Dynamische Typisierungsdebatte
  • Leistung : Generics verbessert die Leistung für Algorithmen / Code, die Value-Typen in einer signifikanten Größenordnung verwenden. Es verhindert den ganzen Boxing-Unboxing-Zyklus, der uns Vor-Generics kostete. Dynamic tut auch dafür nichts.

Was das Schlüsselwort dynamic Ihnen geben würde, ist

  • einfacherer Code (wenn Sie mit Excel interagieren, können Sie sagen ..) Sie müssen den Namen der Klassen oder des Objektmodells nicht angeben. Wenn Sie die richtigen Methoden aufrufen, sorgt die Laufzeitumgebung dafür, dass diese Methode aufgerufen wird, wenn sie zu dem Zeitpunkt im Objekt vorhanden ist. Der Compiler lässt Sie auch dann weg, wenn die Methode nicht definiert ist. Dies bedeutet jedoch, dass dies langsamer ist als ein Compiler-verifizierter / static-typed Methodenaufruf, da die CLR Prüfungen durchführen müsste, bevor sie einen dynamischen var field / method-Aufruf ausführt.
  • Die dynamische Variable kann verschiedene Arten von Objekten zu verschiedenen Zeitpunkten enthalten - Sie sind nicht an eine bestimmte Familie oder Art von Objekten gebunden.
Gishu 06.05.2009 07:15
quelle
8

Um Ihre erste Frage zu beantworten, werden Generika zur Kompilierzeit, dynamische Typen zur Laufzeit aufgelöst. Es gibt also einen deutlichen Unterschied in der Typsicherheit und der Geschwindigkeit.

    
Peter van der Heijden 06.05.2009 06:39
quelle
6

Dynamische Klassen und Generika sind völlig unterschiedliche Konzepte. Mit Generics definieren Sie Typen zur Kompilierzeit. Sie ändern sich nicht, sie sind nicht dynamisch. Sie fügen einfach einen "Platzhalter" zu einer Klasse oder Methode hinzu, damit der aufrufende Code den Typ definiert.

Dynamische Methoden werden zur Laufzeit definiert. Sie haben dort keine Typsicherheit für die Kompilierungszeit. Die dynamische Klasse ist ähnlich, als ob Sie Objektreferenzen und Aufrufmethoden durch ihre String-Namen mit Reflektion haben.

    
Stefan Steinegger 06.05.2009 06:47
quelle
3

Beantworten Sie die zweite Frage: Sie können anonyme Typen in C # 3.0 zurückgeben. Übergeben Sie den Typ an das Objekt, geben Sie es zurück und verwenden Sie die Reflektion, um auf die Mitglieder zuzugreifen. Das dynamische Schlüsselwort ist nur syntaktischer Zucker dafür.

    
Niki 06.05.2009 06:49
quelle

Tags und Links