需要指向Func <>

时间:2019-05-31 22:45:14

标签: c#

我正在尝试有条件地将方法分配给Func<>。我试图分配的方法带有一个指针参数,似乎C#似乎不允许我将其与Func<>一起使用。这是代码。

Func<ulong, ulong, ulong*, ulong> Multiply64Func;

if (Bmi2.X64.IsSupported)
{
    Multiply64Func = Bmi2.X64.MultiplyNoFlags;
}
else
{
    Multiply64Func = Multiply64;
}

这是我以后要使用的方式:

hi = Multiply64Func(c[0], b[0], loPtr);

以及相应的错误:error CS0306: The type 'ulong*' may not be used as a type argument

有什么解决方法,还是有办法使其正常工作?

当然,我可以这样做:

hi = Bmi2.X64.IsSupported ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);

但是,这部分代码对性能非常关键,在热循环中检查此速度会明显降低速度,因此为什么我要执行一次比较并分配对应的函数的方法。

更多的C#要做的是获取ref参数-但是我不能更改Bmi2.X64.MultiplyNoFlags;的签名,因为它不是我的代码。

1 个答案:

答案 0 :(得分:0)

  

但是,这部分代码对性能至关重要,因此我发现在热循环中进行检查会显着降低速度-因此为什么我要执行一次比较

将结果缓存为布尔值并使用简单的答案。

bool useBmi = Bmi2.X64.IsSupported;

while (expensiveLoop)
{
    hi =  useBmi ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);
}

如果您坚持使用委托,则可以执行以下操作:

bool useBmi = Bmi2.X64.IsSupported;
ulong hi;  //Must be declared outside the loop

Action multiply = useBmi
                ? new Action( () => { hi = Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr); })
                : new Action( () => { hi = Multiply64(c[0], b[0], loPtr); } );


while (expensiveLoop)
{
    multiply();
}