Frage

Ich bin sehr gespannt auf die dynamischen Eigenschaften in C # ( C # 4 dynamische Keyword - warum nicht? ), vor allem, weil in bestimmten Bibliothek Teile meines Code ich viel Reflexion verwendet werden.

Meine Frage ist zweifach:

1. bedeutet "dynamisch" ersetzen Generics, wie im Fall unten?

Generics Methode:

public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) {

        //test object is not null, regardless of its Type
        if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) {
            //do something
        }
    }

dynamische Methode (??):

public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) {

        //test object is not null, regardless of its Type?? but how?
        if (ObjToTest != null) {
            //do something
        }
    }

2. bedeutet „dynamisch“ jetzt Methoden erlauben Anonyme Typen zurückgeben, wie im Fall unter:

 public static List<dynamic> ReturnAnonymousType() {
        return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
    }

cool, cheers

EDIT:

Nachdem meine Frage gedacht, ein wenig mehr, und in Anbetracht der Antworten, ich sehe ich völlig verwirrt die Haupt generic / dynamische Frage auf. Sie sind in der Tat ganz anders. Also ja, danke für die Info.

Was ist Punkt 2 aber?

War es hilfreich?

Lösung

dynamic könnte eine begrenzte Anzahl von Reflexions Szenarien vereinfachen (wo Sie den Mitgliedsnamen Front nach oben kennen, aber es gibt keine Schnittstelle) - insbesondere, könnte es helfen, mit generischen Operatoren ( obwohl andere Antworten existieren.) - aber anders als die generische Trick Betreiber, gibt es wenig Crossover mit Generika

Generics können Sie (bei der Kompilierung) über die Art wissen, mit dem Sie arbeiten - umgekehrt dynamic nicht Pflege über den Typ. Insbesondere - Generika können Sie eine Reihe von Bedingungen über ein Typ angeben und nachweisen - das heißt, es könnte einige Schnittstelle implementieren, oder einen öffentlichen parameterlosen Konstruktor haben. dynamic hilft nicht mit entweder:. nicht-Schnittstellen unterstützt, und schlimmer als einfach nicht über Schnittstellen kümmern, bedeutet dies, dass wir nicht einmal sehen explizite Schnittstellenimplementierungen mit dynamic

Darüber hinaus ist dynamic wirklich ein besonderer Fall von object, so Boxen kommen ins Spiel, aber mit einem vengence.

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

  • COM-Interop
  • DLR Interop
  • vielleicht etwas Licht Ente eingeben
  • vielleicht einige allgemeine Operatoren

Für alle anderen Fälle, Generika und regelmäßige C # sind der Weg zu gehen.

Andere Tipps

Um Ihre Frage zu beantworten. Nein.

  • Generics gibt Ihnen " Algorithmus Wiederverwendung " - Sie Code unabhängig von einem Datentyp zu schreiben. das dynamische Keyword tut nichts im Zusammenhang mit diesem. Ich definiere List<T> und dann kann ich es verwenden für Liste von Strings, Ints, etc ...
  • Typ Sicherheit : Die gesamte Kompilierung Debatte zu prüfen. Dynamische Variablen benachrichtigt Sie nicht mit der Kompilierung Warnungen / Fehler in Fall, dass Sie einen Fehler machen, werden sie nur zur Laufzeit die Luft zu sprengen, wenn die Methode, die Sie aufzurufen versuchen, fehlt. Statische vs Dynamische Typisierung Debatte
  • Performance : Generics verbessert die Leistung für Algorithmen / Code Werttypen durch eine signifikante Größenordnung. Es verhindert, dass die gesamte Boxen-Unboxing-Zyklus, der uns vorge Generics kosten. Dynamische nicht allzu dafür alles tun.

Was das dynamic Schlüsselwort würde Ihnen wird

  • einfacher Code (wenn Sie mit Excel interoperierenden können sagen, ..) Sie brauchen nicht den Namen der Klassen oder das Objektmodell zu spezifizieren. Wenn Sie die richtigen Methoden aufrufen, nehmen die Laufzeitpflege diese Methode zum Aufrufen, wenn es zu diesem Zeitpunkt in dem Objekt vorhanden ist. Der Compiler lässt Sie weg, auch wenn die Methode nicht definiert ist. Allerdings bedeutet dies, dass diese langsamer sein wird als einen Compiler-verify / statisch typisierte Methodenaufruf machen, da die CLR Kontrollen hätten durchzuführen, bevor eine dynamische var Feld / Methode invoke zu machen.
  • Die dynamische Variable kann verschiedene Arten von Objekten zu verschiedenen Zeitpunkten halten - Sie sind nicht auf eine bestimmte Familie oder Art von Objekten gebunden
  • .

Um Ihre erste Frage zu beantworten, werden Generika Kompilierung aufgelöst, dynamische Typen zur Laufzeit. So gibt es einen deutlichen Unterschied in der Art der Sicherheit und Geschwindigkeit.

Dynamische Klassen und Generika sind völlig unterschiedliche Konzepte. Mit Generika definieren Sie Typen bei der Kompilierung. Sie ändern sich nicht, sie sind nicht dynamisch. Sie legen sich lediglich ein „Platzhalter“ bis zu einem gewissen Klasse oder Methode, um die anrufende Code den Typ definieren zu machen.

Dynamische Methoden werden zur Laufzeit festgelegt. Sie haben dort nicht die Typsicherheit Compile-Zeit. Die dynamische Klasse ist ähnlich wie wenn Sie Objektreferenzen und Call-Methoden durch seine String-Namen mit Reflexion haben.

Antwort auf die zweite Frage: Sie können anonyme Typen in C # 3.0 zurück. Cast den Typ Objekt, bringen Sie es und verwenden Reflexion seiner Mitglieder zugreifen. Die dynamische Keyword ist nur syntaktischer Zucker für die.

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