web-dev-qa-db-ja.com

C#で動的型を使用する場合の欠点

私は最近C#で dynamic 型についてさらに研究しています。コードがコンパイルされたときに理解したいくつかの例では、コードを再コンパイルする必要はありませんが、 直接実行できます

データ型を自由に変更できるというキーワードの柔軟性はすばらしい 利点 だと思います。

質問、

あります特定の欠点ランタイム例外をスローする間違った動的メソッド呼び出しを除いて開発者が知っておくべきこと実装を開始する前に。

14

主な欠点は、C#の主なプロパティの1つ(必ずしも利点とは限りません)を捨てることです。つまり、静的に型指定されている(そしてほとんどの部分が型安全である)ことです。

動的型付けの問題は、コンパイル中に明らかになるバグをしばしば隠すことです。このようなバグは、実行時にのみ明らかになるため、検出が非常に難しくなります。

IMOがC#で動的型付けを使用する理由はほとんどなく、主なものは 動的型付け言語 とのコラボレーションです(動的が最初に導入された理由はAFAIKです)。

完全に動的に型付けされたプログラミングを行いたい場合は、C#を動的にハックするのではなく、動的に設計された言語を調べる必要があります。 .Netライブラリを使用する場合は、たとえば IronPython を使用できます。

16
Matěj Zábský

どのような欠点を探しているのかわかりませんが、dynamicではなく静的型付けで機能する機能について知りたい場合は、いくつかあります。

  1. 拡張メソッドは機能しません。これはおそらく最大のものです。 _dynamic collection_がある場合、collection.Distinct()のようなコードは使用できません。これは、使用可能な拡張メソッドが名前空間usingsに依存しており、DLRがそれらを知る方法がないためです。

    回避策として、通常の静的メソッドであるかのようにメソッドを呼び出すことができます:Enumerable.Distinct(collection)。または、コレクションのタイプを_IEnumerable<dynamic>_のようなものに変更できます。

  2. foreachにはIEnumerableが必要です。通常のC#では、foreachはパターンベースです。つまり、特定のインターフェースを必要とせず、適切なオブジェクトを返すGetEnumerator()メソッドのみが必要です。 foreachdynamicを使用する場合、IEnumerableの実装が必要です。しかし、この動作の理由はC#1.0にはジェネリックがないため、この「欠点」はほとんど関係ありません。

9
svick

.netの動的型(動的として宣言された変数ではない)の問題は、静的型で利用できる機能の多くがないことです。

  • リフレクションはありません(メンバーを反復することはできますが、他の多くは反復できません)
  • メタデータなし(動的データサイト/ mvcで検証が行われます)
  • コンパイル時にまったくチェックしません(スペルミスは検出されません)
  • これは強力な機能であるため、初心者は乱用/誤用/誤解する傾向があります
  • 動的な型で記述されたコードは、維持が難しく、リファクタリングが難しい傾向があります
  • アヒルのタイピングやその他の機能のために、グルは他の誰にも読めないコードを書くかもしれません

そのため、何をしているのかわからない場合は、動的型を使用してコードを記述しないでください。

7
linkerro

dynamicobjectとしてマークされているだけなので、値の型をボックス化します。

これはパフォーマンスに影響を与える可能性がありますが、私はとにかくパフォーマンスが重要なコードで静的型付けを使用するので、それはおそらく実際には問題ではありません。

このボクシングは、可変値型にも干渉します。これらをdynamicで変更すると、ボックス化されたコピーのみが変更されます。しかし、最初は可変値型を使用するべきではないので、これも大きな問題ではありません。

6
CodesInChaos