私は最近C#で dynamic 型についてさらに研究しています。コードがコンパイルされたときに理解したいくつかの例では、コードを再コンパイルする必要はありませんが、 直接実行できます
データ型を自由に変更できるというキーワードの柔軟性はすばらしい 利点 だと思います。
質問、
あります特定の欠点ランタイム例外をスローする間違った動的メソッド呼び出しを除いて開発者が知っておくべきこと実装を開始する前に。
主な欠点は、C#の主なプロパティの1つ(必ずしも利点とは限りません)を捨てることです。つまり、静的に型指定されている(そしてほとんどの部分が型安全である)ことです。
動的型付けの問題は、コンパイル中に明らかになるバグをしばしば隠すことです。このようなバグは、実行時にのみ明らかになるため、検出が非常に難しくなります。
IMOがC#で動的型付けを使用する理由はほとんどなく、主なものは 動的型付け言語 とのコラボレーションです(動的が最初に導入された理由はAFAIKです)。
完全に動的に型付けされたプログラミングを行いたい場合は、C#を動的にハックするのではなく、動的に設計された言語を調べる必要があります。 .Netライブラリを使用する場合は、たとえば IronPython を使用できます。
どのような欠点を探しているのかわかりませんが、dynamic
ではなく静的型付けで機能する機能について知りたい場合は、いくつかあります。
拡張メソッドは機能しません。これはおそらく最大のものです。 _dynamic collection
_がある場合、collection.Distinct()
のようなコードは使用できません。これは、使用可能な拡張メソッドが名前空間using
sに依存しており、DLRがそれらを知る方法がないためです。
回避策として、通常の静的メソッドであるかのようにメソッドを呼び出すことができます:Enumerable.Distinct(collection)
。または、コレクションのタイプを_IEnumerable<dynamic>
_のようなものに変更できます。
foreach
にはIEnumerable
が必要です。通常のC#では、foreach
はパターンベースです。つまり、特定のインターフェースを必要とせず、適切なオブジェクトを返すGetEnumerator()
メソッドのみが必要です。 foreach
でdynamic
を使用する場合、IEnumerable
の実装が必要です。しかし、この動作の理由はC#1.0にはジェネリックがないため、この「欠点」はほとんど関係ありません。
.netの動的型(動的として宣言された変数ではない)の問題は、静的型で利用できる機能の多くがないことです。
そのため、何をしているのかわからない場合は、動的型を使用してコードを記述しないでください。
dynamic
はobject
としてマークされているだけなので、値の型をボックス化します。
これはパフォーマンスに影響を与える可能性がありますが、私はとにかくパフォーマンスが重要なコードで静的型付けを使用するので、それはおそらく実際には問題ではありません。
このボクシングは、可変値型にも干渉します。これらをdynamic
で変更すると、ボックス化されたコピーのみが変更されます。しかし、最初は可変値型を使用するべきではないので、これも大きな問題ではありません。