2016-05-01 8 views
1

バイナリファイル、TCPパケットなどのバイナリ構造の「上位レベル」表現になるようにクラスを作成しています。属性をコンパイル時のデータとして定義しますか?

これは、読みやすくするために、カスタム属性を定義して、各クラスのフィールドに関する情報(バイナリバッファ内のそのフィールドのオフセット、フィールドのサイズなど)を決定することができます。

これは定数を宣言することで実現できますが、IMHOコードは非常に醜いです。だから私は、私が欲しいものを達成するための非常にエレガントな方法である属性の使用について考えました。 InteropServices.Marshalのような機能は、実際には、StructLayout、MarshalAs、FieldOffsetなどの属性を使用して、必要なものと非常によく似たものを実現します。したがって、パフォーマンスのトレードオフは、 m間違っている)。

したがって、前述のInteropServicesの属性はどのようにコンパイラ/ CLRによって処理されますか?

上記のトレードオフは価値があると思いますか?はいの場合、属性を処理する最も良い方法は、Refletionを使用するデフォルトのメソッドを使用することですか?私はこれが少し高価であることを知っているので、Reflectionではなく属性にアクセスする他の方法があると仮定しています。マーシャルはほとんどすべての方法でそれを使用しています。

ご協力いただきありがとうございます、ありがとうございます。

答えて

1

あなたが説明しているほどInteropに類似していると仮定して妥当なものを提案していますか。プロパティのアクセスごとにリフレクションを使用する際のパフォーマンスの問題を回避するには、リフレクションを静的コンストラクタ経由で使用し、代わりに各プロパティのコンパイル済み式をビルドします。パフォーマンスは、私が考えると思われる仮想メソッドを呼び出すのと同等でなければなりません。

ここには、異なる動的呼び出しタイプ間のパフォーマンスの違いを示すブログ記事へのリンクがあります。コンパイルされた式はキャッシュされたリフレクションよりも10倍高速で、コンパイルされたプロパティアクセスよりも2倍遅いだけです。

http://www.palmmedia.de/Blog/2012/2/4/reflection-vs-compiled-expressions-vs-delegates-performance-comparision

+0

こんにちはマイク、答えに感謝します。これがマーシャルのメソッドが属性を処理する方法であるかどうかは分かりますか?私はそのheheについて少し不思議です。 – ptr0x

+0

構造体とレイアウト属性は特別なもので、clrはメモリを特定の方法でレイアウトすることを意味しています。すべての細部の詳細については、これは良いリファレンスです:https://www.simple-talk.com/dotnet/.net-framework/5-tips-for-understanding-managed-unmanaged-interoperability-in-.net/ –

+0

どうもありがとうございました! :) – ptr0x

関連する問題