C++到C#端口的问题:如何处理一个以double*为参数的方法
本文关键字:double 一个以 处理 方法 参数 何处理 问题 C++ | 更新日期: 2023-09-27 18:05:43
我正在将C++库移植到C#,我遇到了一些将双*指针作为参数的方法。处理这个问题的最佳方法是什么?也许可以修改调用代码,使其不传递指针?我只想把代码包装在一个"不安全"的块中,并设置编译器的/unsafe标志,但我不能在方法签名中这样做。
也许在参数上使用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
成为返回值(这是我建议的方式( - 将参数声明为
ref
或out
(取决于是否要保证被调用函数将赋值
不要只是在代码周围抛出unsafe
块,这样您就可以继续使用指针;unsafe
应谨慎使用(最好不要使用(。
这取决于函数如何使用指针。你真的没有提供足够的信息来给出一个可靠的答案,但我无论如何都会尝试一下。
正常C#代码
如果方法中的代码正在取消引用指针并赋值,而不进行任何指针运算,那么只需将参数设为out
参数即可。
如果上一段为true,并且您还没有返回值,只需修改方法的签名即可返回double
。
如果代码不进行指针运算,但使用已存在于指向位置的值并进行赋值,则将该参数设为ref
参数。
如果代码不进行指针运算,使用值,但不赋值,那么您可能应该将其从指针更改为普通的double
,而不是使其成为ref
或out
。
如果函数的实现是进行指针运算,那么您需要构建并传递某种可索引集合,例如实现IList
或数组的集合。
普通C#代码的替代方案
您也可以选择将代码标记为unsafe
,并使用指针。这可能比简单的逻辑翻译要多得多,但更有可能保持类似的性能。
您也可以选择使用C++/CLI而不是C#。它也是一个。Net语言,并且直接与现有C++代码集成可能更简单(取决于您的应用程序(。