Ich habe kürzlich mehr über die dynamischen Typen in C # gelernt. Mit einigen Beispielen habe ich verstanden, dass der Code nach dem Kompilieren nicht erneut kompiliert werden muss, sondern direkt ausgeführt werden kann.
Ich halte die Flexibilität, die das Schlüsselwort bietet, um den Datentyp tatsächlich nach Belieben ändern zu können, für einen großen Vorteil .
Frage,
Gibt es bestimmte Mängel, abgesehen von falschen dynamischen Methodenaufrufen, die Laufzeitausnahmen auslösen, die Entwickler kennen müssen, bevor sie mit der Implementierung beginnen.
c#
.net
visual-studio-2010
Karthik Sreenivasan
quelle
quelle
object
oder direkte Typumwandlungen immer als Code-Geruch betrachtet. In fast allen Fällen bedeutete dies, dass ich oder eines meiner Teams keine entsprechende Schnittstelle für diese Funktionalität entwickelt hatten. Ich vermute, wenn ich jetzt C # 4 verwenden würde, würde ich auch in Bezug auf die Verwendung von so ziemlich dasselbe empfindendynamic
. Ich könnte den Fall dafür sehen, wenn Sie alles dynamisch machen, aber in diesem Fall könnten Sie genauso gut eine dynamisch geschriebene Sprache an erster Stelle ausgewählt haben. * 8 ')dynamic
in C # arbeiten, müssen Sie nicht auf IronPython verzichten, wenn Sie nur einen kleinen Teil Ihres Codes dynamisch eingeben müssen. Für einen Ausdrucksauswerter hatte ich großen Erfolg damitdynamic
, die Operanden eines Ausdrucks und die Ergebnisse der Auswertung darzustellen.dynamic
wünschte ich, ich hätte bei der Entwicklung mit .Net etwas über IronPython gewusst - es hätte bestimmte Dinge, die wir zu tun versuchten, viel einfacher machen können.Antworten:
Das Hauptmanko ist, dass Sie eine der Haupteigenschaften (nicht unbedingt Vorteile) von C # wegwerfen - dass es statisch typisiert ist (und größtenteils typensicher ist).
Das Problem bei der dynamischen Typisierung besteht darin, dass häufig Fehler ausgeblendet werden, die ansonsten beim Kompilieren aufgedeckt würden. Ein solcher Fehler tritt dann nur zur Laufzeit auf, was es natürlich viel schwieriger macht, ihn zu erkennen.
Es gibt nur wenige IMO-Gründe für die Verwendung der dynamischen Typisierung in C #. Der Hauptgrund ist die Zusammenarbeit mit dynamisch typisierten Sprachen (AFAIK ist der Grund, warum die dynamische Typisierung ursprünglich eingeführt wurde).
Wenn Sie vollständig dynamisch programmieren möchten, sollten Sie sich eine Sprache ansehen, die so konzipiert ist, dass sie dynamisch ist, und nicht C #, um dynamisch zu sein. Sie können beispielsweise IronPython verwenden, wenn Sie .NET-Bibliotheken verwenden möchten
quelle
dynamic
die Sie gibt, ist die Fähigkeit, ein Objekt ohne jede Art von Reflexionshack auf seinen tatsächlichen Typ hochzuwerfen. Zum Beispiel, wennBase foo = new Derived();
und es gab zwei überladene MethodenMoo(Base x)
undMoo(Derived x)
, dannMoo(foo)
ruft aufMoo(Base x)
, aberMoo((dynamic)foo)
ruft aufMoo(Derived x)
. Dies führt zu einer sehr eleganten Implementierung des Besuchermusters, zum Beispiel: code.logos.com/blog/2010/03/…, und ist im Allgemeinen eine sehr leistungsfähige Technik.Ich bin mir nicht sicher, welche Art von Mängeln Sie suchen, aber wenn Sie wissen möchten, welche Funktionen mit statischer Eingabe funktionieren, aber nicht mit
dynamic
, gibt es einige:Erweiterungsmethoden funktionieren nicht. Dies ist wahrscheinlich der größte. Wenn Sie haben
dynamic collection
, können Sie keinen Code wie verwendencollection.Distinct()
. Das liegt daran, dass die verfügbaren Erweiterungsmethoden von Namespaces abhängenusing
und der DLR keine Möglichkeit hat, diese zu ermitteln.Als Abhilfe können Sie entweder die Methode aufrufen , als ob es normale statische Methode war:
Enumerable.Distinct(collection)
. Oder Sie können den Typ der Sammlung in etwas ändernIEnumerable<dynamic>
.foreach
erfordertIEnumerable
. In normalem C #foreach
ist musterbasiert. Das heißt, es ist keine bestimmte Schnittstelle erforderlich, nur eineGetEnumerator()
Methode, die ein geeignetes Objekt zurückgibt. Wenn Sieforeach
auf verwendendynamic
, ist die Implementierung vonIEnumerable
erforderlich. Aber da der Grund für dieses Verhalten darin besteht, dass C # 1.0 keine Generika hatte, ist dieses "Manko" so ziemlich irrelevant.quelle
Das Problem mit dynamischen Typen (keine als dynamisch deklarierten Variablen) in .net besteht darin, dass statischen Typen nicht viele Funktionen zur Verfügung stehen.
Schreiben Sie also keinen Code mit dynamischen Typen, es sei denn, Sie wissen, was Sie tun.
quelle
Da
dynamic
es sich nur um ein gekennzeichnetesobject
Feld handelt, werden Werttypen angezeigt.Dies kann Auswirkungen auf die Leistung haben, aber da ich sowieso die statische Eingabe in leistungskritischen Code verwenden würde, ist dies in der Praxis wahrscheinlich kein Problem.
Dieses Boxen stört auch veränderbare Werttypen. Wenn Sie sie mit ändern
dynamic
, ändern Sie nur die Boxed Copy. Da Sie jedoch in erster Linie keine veränderlichen Werttypen verwenden sollten, ist dies auch kein großes Problem.quelle