2016-05-01 3 views
1

Я пишу классы как «более высокого уровня» представления некоторых двоичных структур как двоичные файлы, tcp-пакеты и т. Д.Определить атрибуты как данные времени компиляции?

Для этого и для удобства чтения это было бы очень приятно, если бы я может определить некоторый пользовательский атрибут, чтобы определить некоторую информацию о поле каждого класса (например, смещение этого поля в двоичном буфере, размер поля и т. д.).

Я мог бы это сделать, объявив постоянные целые числа, но ИМХО код был бы очень уродливым и грязным. Поэтому я подумал об использовании атрибутов, которые являются очень элегантным способом выполнить то, что я хочу. Такие функции, как InteropServices.Marshal, фактически используют атрибуты (как StructLayout, MarshalAs и FieldOffset) для достижения чего-то очень похожего на то, что я хочу, поэтому я могу только предположить, что компромисс между производительностью выгоден по сравнению с приростом удобочитаемости (пожалуйста, исправьте меня, неверно).

Итак, как обработанные атрибуты InteropServices обрабатываются компилятором/CLR?

Вы, ребята, считаете, что этот недостаток стоит? Если да, лучший способ справиться с атрибутами - использовать метод по умолчанию с помощью Refletion? Я предполагаю, что могут быть другие способы доступа к атрибутам, а не к Reflection, потому что я знаю, что это немного дорого, и Маршал использует его почти по каждому методу.

Любая полезная мысль была бы очень признательна, спасибо.

ответ

1

То, что вы предлагаете, звучит разумно, предполагая, что параллели с Interop настолько же ясны, как вы описываете. Чтобы избежать проблем с производительностью при использовании отражения для каждого доступа к свойствам, вы можете использовать отражение один раз, возможно, через статический конструктор и вместо этого скомпилировать выраженные выражения для каждого свойства. Производительность должна быть эквивалентной вызову виртуального метода, который я бы подумал.

Вот ссылка на сообщение в блоге, обозначающее различия в производительности между различными типами динамических вызовов. Скомпилированные выражения ~ 10 раз быстрее, чем кэшированное отражение и «только» 2x медленнее, чем скомпилированный доступ к свойствам.

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

+0

Здравствуйте, Майк, благодарю вас за ответ. Знаете ли вы, что методы маршала касаются атрибутов? Мне немного любопытно, что хе-хе. – ptr0x

+0

Nope. Атрибуты структуры и компоновки являются особыми, и clr знает, что они имеют в виду макет памяти определенным образом. Для всех деталей gore это хорошая ссылка: https://www.simple-talk.com/dotnet/.net-framework/5-tips-for-understanding-managed-unmanaged-interoperability-in-.net/ –

+0

Большое спасибо! :) – ptr0x

 Смежные вопросы

  • Нет связанных вопросов^_^