使用Action <pointerclass *>作为参数</pointerclass *>

时间:2011-08-12 21:50:15

标签: c# .net pointers unsafe

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

我可以使用Action<IntPtr>但是我需要在每次迭代中将它转换为方法体内的适当指针,这会破坏“性能关键”的整体想法。

2 个答案:

答案 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);