我需要将一堆函数从C++转换成C#。这些函数的方法声明如下
void foo(struct input data*, double* ret1, double *ret2)
{
// if ret1 is not NULL, return something in it
if (ret1)
{
*ret1 = SomeComplexAndExpensiveMath(data);
}
if (ret2)
{
*ret2 = MoreComplexAndExpensiveMath(data);
}
}
当我将其转换为C#时,out paramters通常是首选,但通过 null
不允许对声明为 "out double "的参数使用。
void foo(input data, out double ret1, out double ret2)
{
if (ret1 != null) // Error.
{
// ...
}
}
使用 ref double?
作为参数类型,看起来也很奇怪,会造成额外的开销。
有没有一种方法可以让我保持漂亮的简单的 out double
参数类型,同时还不计算调用者不需要的返回值?有没有一种方法可以知道调用者做了,即 foo(input, out _, out b)
表示他不需要ret1?
检查 文献. 有趣的部分是。
作为输出参数传递的变量在方法调用中传递之前不需要初始化。然而,被调用的方法在返回之前需要分配一个值。
所以,调用者会认为,无论你传递什么值,都会被忽略。
最新版本的VS会告诉你,如果你尝试的话。
int prs = 1; // Will inform you of unessecary assignment of prs
Int32.TryParse("2", prs);
所以... out
声明假定它将默认覆盖该值。你最好的选择是使用 ref
关键字,如果你想模拟同样的功能。
检查 C#指针在方法的参数中?
与C++解决方案相比,额外的开销是什么?