使用Action< PointerClass *比;作为论据

本文关键字:Action PointerClass 使用 | 更新日期: 2023-09-27 18:05:32

我正在创建一个实现图像处理的性能关键型应用程序。我用一些像素指针用我的结构体Pixel做一些处理。我有很多遍历整个位图数据的代码部分,为了代码可重用性和模块化,我正在设计一种方法,它将采取一个操作并将其应用于图像的所有像素(如地图函数)。然而,当我写Action<Pixel*>时,Visual Studio抱怨代码说类型Pixel*可能不能用作类型参数。整个类是在unsafe上下文中,我使用Pixel指针无处不在,但我只是不能使用像素指针作为一个动作的模板类。

我可以使用Action<IntPtr>,但我需要在每次迭代中将其转换为方法体内部的适当指针,这将扼杀"性能关键"的整个想法。

使用Action< PointerClass *比;作为论据

似乎没有什么是强迫你使用Action<T>,所以你可以创建自己的委托类型。我没有找到一种通用的方式来做到这一点,但这是有效的:

unsafe delegate void PixelAction(Pixel* ptr);

请记住,如果这真的是性能关键,调用委托比直接调用方法要慢。也许另一种方法会更好,比如复制代码(如果在您的情况下可以工作的话),或者在编译时或运行时使用反射生成代码。Emit或CodeDOM.

指针类型不是类,因此不能用作泛型类型参数。

我认为您唯一的方法是定义Action,并在必要时在两边进行转换。我不认为性能的冲击会像你想的那样糟糕,当编译与优化。

编辑:原来下面不工作(CS0208)

或者使用Action定义自己的委托类型也可以:

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