从CC++到C#的参数类型转换。"double*"转换为 "out double"?

问题描述 投票:1回答:1

我需要将一堆函数从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?

c# c++ pass-by-reference out
1个回答
1
投票

检查 文献. 有趣的部分是。

作为输出参数传递的变量在方法调用中传递之前不需要初始化。然而,被调用的方法在返回之前需要分配一个值。

所以,调用者会认为,无论你传递什么值,都会被忽略。

最新版本的VS会告诉你,如果你尝试的话。

int prs = 1; // Will inform you of unessecary assignment of prs
Int32.TryParse("2", prs);

所以... out 声明假定它将默认覆盖该值。你最好的选择是使用 ref 关键字,如果你想模拟同样的功能。

检查 C#指针在方法的参数中?

与C++解决方案相比,额外的开销是什么?

© www.soinside.com 2019 - 2024. All rights reserved.