我正在创建一个实现图像处理的性能关键型应用程序。我正在使用一些像素指针使用我的名为Pixel
的结构来进行一些处理。我有很多代码部分迭代整个位图数据,为了代码的可重用性和模块性,我正在设计一个方法,它将采取一个动作并将其应用于图像的所有像素(如地图)功能)。但是,当我写Action<Pixel*>
时,Visual Studio会抱怨代码说Pixel*
类型不能用作类型参数。整个类都在unsafe
上下文中,我到处都在使用Pixel
指针,但我不能将像素指针用作Action的模板类。
我可以使用Action<IntPtr>
但是我需要在每次迭代中将它转换为方法体内的适当指针,这会破坏“性能关键”的整体想法。
答案 0 :(得分:8)
似乎没有什么是强迫您使用Action<T>
,因此您可以创建自己的委托类型。我没有找到以通用方式执行此操作的方法,但这可行:
unsafe delegate void PixelAction(Pixel* ptr);
请记住,如果这对性能至关重要,则调用委托比直接调用方法要慢。也许另一种方式可能更好,比如在编译时或在运行时使用Reflection.Emit或CodeDOM复制代码(如果这样可以在您的情况下工作)或代码生成。
答案 1 :(得分:1)
指针类型不是类,因此它们不能用作泛型类型参数。
我认为您唯一的方法是定义Action&lt; IntPtr&gt;,并在必要时双方投射。我认为在使用优化进行编译时,性能损失并不像您想象的那么糟糕。
编辑:结果以下不起作用(CS0208)
要么是这样,要么代替使用Action&lt; T&gt;定义自己的委托类型可能有效:
delegate void PointerAction<T>(T* ptr);