Использование Action <PointerClass *> в качестве аргумента - PullRequest
5 голосов
/ 13 августа 2011

Я создаю критичное к производительности приложение, которое реализует манипуляции с изображениями.Я использую некоторые пиксельные указатели, используя мою структуру с именем Pixel, чтобы выполнить некоторую обработку.У меня есть много частей кода, которые перебирают все растровые данные, и для повторного использования кода и модульности я разрабатываю метод, который будет выполнять действие и применять его ко всем пикселям изображения (например, к карте).функция).Однако когда я пишу Action<Pixel*> Visual Studio жалуется на код, говорящий, что тип Pixel* не может использоваться в качестве аргумента типа.Весь класс находится в unsafe контексте, и я везде использую Pixel указатели, но я просто не могу использовать пиксельный указатель в качестве класса шаблона Action.

Я могу использовать Action<IntPtr>, ноМне нужно будет преобразовывать его в соответствующие указатели внутри тела метода в КАЖДОЙ итерации, что убило бы всю идею о «критичности к производительности».

Ответы [ 2 ]

8 голосов
/ 13 августа 2011

Кажется, ничто не заставляет вас использовать Action<T>, поэтому вы можете создать свой собственный тип делегата.Я не нашел способ сделать это в общем виде, но это работает:

unsafe delegate void PixelAction(Pixel* ptr);

Имейте в виду, что если это действительно критично к производительности, вызов делегата происходит медленнее, чем просто вызов методанепосредственно.Может быть, другой способ может быть лучше, например, дублирование кода (если это будет работать в вашем случае) или генерация кода, либо во время компиляции, либо во время выполнения с использованием Reflection.Emit или CodeDOM.

1 голос
/ 13 августа 2011

Типы указателей не являются классами, и поэтому их нельзя использовать в качестве аргументов универсального типа.

Я думаю, что ваш единственный подход заключается в определении Action и приведении его по необходимости с обеих сторон.Я не думаю, что производительность будет такой же плохой, как вы думаете при компиляции с оптимизацией.

РЕДАКТИРОВАТЬ: оказывается, что ниже не работает (CS0208)

Либо этоили вместо использования Action определение собственного типа делегата может сработать:

delegate void PointerAction<T>(T* ptr);

...