質問

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

しかし、その後、スコット・ハンセルマンが動的キーワードが「反射を痛みを軽減する」と述べているのを聞いた。

それで、動的コードに由来しないオブジェクトを反映する目的で動的キーワードを使用することは許容されるでしょうか?

役に立ちましたか?

解決

「いいえ」と言いますが、めちゃくちゃ使い始めないでください。実際、 dynamic は、ベンチマークを行ったところから、リフレクション Invoke を使用するのではなく、デリゲートを保持しているため、基本的なリフレクションよりも高速時間)。特に、2つの長所は次のとおりです。

  • ジェネリックメソッドの呼び出し( MakeGenericMethod などは非常に苦痛です)
  • 演算子の呼び出し

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

dynamic のマイナス面は、(非常識なコードを書かずに)便利になるためには、コンパイル時に名前を知る必要があるということです。多くの場合そうではありません。そうでなければ、私たちはこのピクルスにいません!実行時に名前しかわからない場合、他のオプションがあります( Expression Delegate.CreateDelegate 、" HyperDescriptor"、 DynamicMethod など)高速な方法でデータにアクセスします。

他のヒント

アヒルのタイピングが必要であり、コンパイル時のタイプセーフが本当に必要ない場合は、先に進み、ダイナミックを使用してください。 C#のみのコード(ExpandoObjectを使用したXMLなどの動的データソースへのクエリなど)でポップアップする新しい使用法がいくつかあると確信しています。ジェネリックの多くの使用がポリモーフィズムを表現するより複雑な方法であるのと同じように、多くの新しい使用法が不必要になると確信しています。

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

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

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

また、動的キーワードの別のユースケースを示す例を投稿しました: C#4.0の動的:DynamicObjectを使用したラッパーの作成。これらはまさに、Freedが話していたタイプの例です:XMLデータとの相互運用の単純化。

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

動的キーワードは、明らかにCOMおよび動的言語の操作をはるかに容易にすることを目的としていましたが、それがこれらの領域に限定する必要があるという意味ではありません。パフォーマンスに関しては、パフォーマンスに問題が発生するまで気をつけてください。 (これは、開始する前にパフォーマンスを損なう可能性のある高レベルの設計選択に影響を与える可能性が非常に低い、これらの低レベルの詳細の1つです。)

編集

また、優れた言語設計者は、人々が言語機能を予想外の方法で使用するという事実を認識しています。これは、動的な動作を可能にするインターフェースを作成したため、この議論に特に関連しています。彼らは意図的に人々が「ダイナミック」にほとんど何でも引っ掛けることを許可しました。キーワード機能。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top