4


1

dynamicキーワードは動的言語でのみ使用されることを意図していますか?

私は最近Code Camp 12に参加しましたが、C#4.0の新しい「+ dynamic +」キーワードは動的言語との相互運用にのみ使用されるべきであると話しました。 彼はまた、通常の反射(それ自体はやや遅い)に比べて、やや遅いと言っています。

しかしそれから私はスコットHanselmanが動的キーワードが「反射をより痛みを少なくする」と述べているのを聞いた。

それでは、動的コードから来ていないオブジェクトを反映する目的でdynamicキーワードを使用することは受け入れられるでしょうか?

5 Answer


7


私は「いいえ」と言うでしょう、しかし不当にそれを使い始めないでください。 実際、 `+ dynamic `は、(リフレクション ` Invoke +`を常に使用するのではなく)デリゲートを保持しているため、基本的なリフレクションより_faster_です。 特に、2つの長所があります。

  • ジェネリックメソッドを呼び出す( `+ MakeGenericMethod +`などはまさに 痛い)

  • 呼び出し元オペレーター

ただし、インターフェイスなどで必要なことを行う方法を使用しています。非動的型の `+ dynamic +`は、実際にはダックタイピングに相当します。 これは*非常に限られた*シナリオのセットで役に立ちます。ほとんどの場合:インターフェースが優先されます。 除外しないでください。

+ dynamic +`の欠点は、(非常識なコードを書かずに)役に立つためには、コンパイル時に名前を知る必要があるということです。多くの場合そうではありません。そうでなければ、私たちはこのピクルスにいません! 実行時に名前のみがわかっている場合、他のオプション( `+ Expression ++ Delegate.CreateDelegate +、 "HyperDescriptor"、 `+ DynamicMethod +`など)を使用して高速でデータにアクセスできます。


4


アヒルの型付けが必要で、コンパイル時の型の安全性があまり必要ないと思われる場合は、先に進んでdynamicを使用してください。 私はそれがC#のみのコードでポップアップするための多くの新しい使用法があると確信しています(ExpandoObjectを使用してXMLのような動的なデータソースを問い合わせるなど)。 私は、多くの新しい用法が不必要になることを確信しています。ジェネリックの多くの使用は、多態性を表現するためのもっと複雑な方法です。

パフォーマンスに関しては、.NET 4のDLRは動的型付けを「高速」にしようとしています。 いつものように、それが十分速い場合は、アプリケーションのプロファイリングを開始するときに理解できるものです。


2


私が知っていることから、 `+ dynamic +`キーワードがC#で導入された主な理由は、COMオブジェクトとの相互運用を容易にすることでした。 しかしもちろん、それは反射のために使用することができます…​


2


その答えは、動的キーワードは相互運用機能のためのものであり、動的言語相互運用機能のためだけではありません。 COM相互運用機能はその一例です。 C#チームはこの機能を使用するようにCOM相互運用機能を既に変更しており、これにより相互運用機能がはるかに簡単になりました。 私は最近、ASP.NET MVCビューが似たようなことをしているのを見ました。

私はまた動的キーワードのための別のユースケースを示す例を投稿しました:http://blogs.msdn.com/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with -dynamicobject.aspx [C#4.0の動的:DynamicObjectを使用したラッパーの作成]。 これらはまさにFreedが話していた例のタイプです:XMLデータとの相互運用性の単純化。


1


「いいえ」と言わなければなりません。 あまり期待されていない使用例としては、http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspxをご覧ください。

dynamicキーワードは、COMおよび動的言語をより扱いやすくすることを明確に意図していましたが、それは私たちがそれをそれらの分野に限定するべきではないことを意味します。 パフォーマンスに関する限り:それを覚えておいてください、しかしあなたがパフォーマンスの問題を抱えるまでそれに集中しないでください。 (これは、始める前にパフォーマンスを低下させる可能性がある高水準設計の選択に影響を与える可能性が低い、これらの低水準の詳細の1つです。)

編集

また、優れた言語設計者であれば、人々が言語機能を予期しない方法で使用することに気付いています。 動的な動作を可能にするインターフェイスを作成したため、これは特にこの説明に関連しています。 意図的に、人々が「動的な」キーワード機能にほとんど何でもフックできるようにしました。