C++到C#端口的问题:如何处理一个以double*为参数的方法

本文关键字:double 一个以 处理 方法 参数 何处理 问题 C++ | 更新日期: 2023-09-27 18:05:43

我正在将C++库移植到C#,我遇到了一些将双*指针作为参数的方法。处理这个问题的最佳方法是什么?也许可以修改调用代码,使其不传递指针?我只想把代码包装在一个"不安全"的块中,并设置编译器的/unsafe标志,但我不能在方法签名中这样做。

C++到C#端口的问题:如何处理一个以double*为参数的方法

也许在参数上使用ref(或out(就足够了,或者如果您需要处理这些参数的数组,请使用double[]

也许可以发布方法定义,这样可以更清楚地了解您真正需要的内容。

我假设您希望使用托管安全代码

取决于指针的使用方式。如果它被用作方法中的数组,那么您需要将一个数组传递给该方法,因此需要更改签名。

如果它被用作替身并(重新(分配,则取决于它。该方法是否具有返回类型?如果是这样的话,使用裁判替身可能是一种方法。如果该方法没有返回类型,则返回所分配的值,并让调用者传递到本地,而不是通过引用传递。

如果double*用作double并且从不赋值,则简单地作为double传递。

可能翻译为ref double或out double或double[]。它应该是什么取决于代码的语义。C++double*实际上可以表示很多东西。

极不可能需要不安全的代码。

您可以将函数标记为unsafe,并使用/ansafe标志进行编译:

private static unsafe void MyFunction(double *d)

请参阅http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

在传递指针时,只需将默认的按值传递机制更改为参照传递

public void SomeMethod(ref double val) { }

在其中,您需要确保在调用ref时指定它:

SomeMethod(ref 12.0);

您的操作将取决于指针的使用方式。如果指针在那里,以便调用代码可以传递一个double的数组,那么让方法接受一个double[]。如果指针在那里,那么被调用的代码可以从调用方修改double变量的值,那么您有两个选择:

  • 修改调用的语义,使double成为返回值(这是我建议的方式(
  • 将参数声明为refout(取决于是否要保证被调用函数将赋值

不要只是在代码周围抛出unsafe块,这样您就可以继续使用指针;unsafe应谨慎使用(最好不要使用(。

这取决于函数如何使用指针。你真的没有提供足够的信息来给出一个可靠的答案,但我无论如何都会尝试一下。

正常C#代码

如果方法中的代码正在取消引用指针并赋值,而不进行任何指针运算,那么只需将参数设为out参数即可。

如果上一段为true,并且您还没有返回值,只需修改方法的签名即可返回double

如果代码不进行指针运算,但使用已存在于指向位置的值并进行赋值,则将该参数设为ref参数。

如果代码不进行指针运算,使用值,但不赋值,那么您可能应该将其从指针更改为普通的double,而不是使其成为refout

如果函数的实现是进行指针运算,那么您需要构建并传递某种可索引集合,例如实现IList或数组的集合。

普通C#代码的替代方案

您也可以选择将代码标记为unsafe,并使用指针。这可能比简单的逻辑翻译要多得多,但更有可能保持类似的性能。

您也可以选择使用C++/CLI而不是C#。它也是一个。Net语言,并且直接与现有C++代码集成可能更简单(取决于您的应用程序(。